home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / doom / turric03.zip / TURRIC03.ZIP / PROGS / WEAPONS.QC < prev    next >
Text File  |  1997-02-06  |  66KB  |  2,652 lines

  1. /*
  2. ==============================================================================
  3.  
  4. WEAPONS
  5.  
  6. ==============================================================================
  7. */
  8. // prototypes
  9. void (entity targ, entity inflictor, entity attacker, float damage) T_Damage;
  10. void () player_run;
  11. void(entity bomb, entity attacker, float rad, entity ignore) T_RadiusDamage;
  12. void(vector org, vector vel, float damage) SpawnBlood;
  13. void() SuperDamageSound;
  14.  
  15. //** PATCH_BEGIN - throwaxe ****
  16. void() W_ThrowAxe;
  17. //** PATCH_END - throwaxe ******
  18.  
  19. //** PATCH_BEGIN - tchwpn10 - Turrican ****
  20. void(vector org, vector vec) LaunchLaser;
  21. //** PATCH_END - tchwpn10 - Turrican ******
  22.  
  23. //** PATCH_BEGIN - lazsight - Turrican ****
  24. void ( entity targ_owner )    LaserTargeterToggle;
  25. //** PATCH_END - lazsight - Turrican ******
  26.  
  27. // called by worldspawn
  28. void() W_Precache =
  29. {
  30.     precache_sound ("weapons/r_exp3.wav");    // new rocket explosion
  31.     precache_sound ("weapons/rocket1i.wav");    // spike gun
  32.     precache_sound ("weapons/sgun1.wav");
  33.     precache_sound ("weapons/guncock.wav");    // player shotgun
  34.     precache_sound ("weapons/ric1.wav");    // ricochet (used in c code)
  35.     precache_sound ("weapons/ric2.wav");    // ricochet (used in c code)
  36.     precache_sound ("weapons/ric3.wav");    // ricochet (used in c code)
  37.     precache_sound ("weapons/spike2.wav");    // super spikes
  38.     precache_sound ("weapons/tink1.wav");    // spikes tink (used in c code)
  39.     precache_sound ("weapons/grenade.wav");    // grenade launcher
  40.     precache_sound ("weapons/bounce.wav");    // grenade bounce
  41.     precache_sound ("weapons/shotgn2.wav");    // super shotgun
  42.  
  43. //** PATCH_BEGIN - gibbin3 - Turrican ****
  44.     precache_sound ("zombie/z_hit.wav");    // Grenade bounce on corpse.
  45. //** PATCH_END - gibbin3 - Turrican ******
  46.  
  47. //** PATCH_BEGIN - eatgibs ****
  48.     precache_sound ("demon/dhit2.wav");     // for eatin' heads
  49.     precache_sound ("zombie/z_miss.wav");   // for eatin' gibs
  50. //** PATCH_END - eatgibs ******
  51.  
  52. //** PATCH_BEGIN - grap109b ****
  53.     precache_sound2 ("blob/land1.wav");     // chain go splorch!
  54.     precache_sound ("items/protect3.wav");  // Heheh... fix for cheats
  55.     precache_sound ("items/damage2.wav");   // This too
  56.     precache_sound ("items/damage3.wav");   // This too
  57.     precache_sound ("weapons/chain1.wav");  // chain cranking out
  58.     precache_sound ("weapons/chain2.wav");  // chain cranking in
  59.     precache_sound ("weapons/chain3.wav");  // chain swaying in breeze
  60.     precache_sound ("weapons/bounce2.wav"); // chain release
  61. //    precache_sound ("weapons/gotcha.wav");  // annoying comment by player
  62. //** PATCH_END - grap109b ******
  63.  
  64. //** PATCH_BEGIN - throwaxe ****
  65.     precache_model ("progs/throwaxe.mdl");   // ax model
  66.     precache_sound ("weapons/woosh.wav");  // WOOSH sound for throwing axe
  67.     precache_sound ("weapons/taxhit1.wav");  // new ax hit sound (FROM QTEST)
  68.     precache_sound ("weapons/taxhit2.wav");  // new ax hit sound (FROM QTEST)
  69.     precache_sound ("weapons/taxhit3.wav");  // new ax hit sound (FROM QTEST)
  70. //** PATCH_END - throwaxe ******
  71.  
  72. //** PATCH_BEGIN - pipebombs - Turrican ****
  73.     precache_model ("progs/v_pipe.mdl");
  74. //** PATCH_END - pipebombs - Turrican ******
  75.  
  76. //** PATCH_BEGIN - tchwpn10 - Turrican ****
  77.     precache_model("progs/v_laser.mdl");
  78.     precache_model("progs/v_laser2.mdl");
  79.     precache_model2("progs/laser.mdl");
  80.     precache_sound2("enforcer/enfire.wav");
  81.     precache_sound2("enforcer/enfstop.wav");
  82. //** PATCH_END - tchwpn10 - Turrican ******
  83.  
  84. //** PATCH_BEGIN - flame thrower - Turrican ****
  85.     precache_model ("progs/v_flame.mdl");
  86.     precache_model ("progs/flame.mdl");
  87.     precache_model ("progs/flame2.mdl");
  88.     precache_sound ("weapons/flame.wav");
  89.     precache_sound ("player/slimbrn2.wav");
  90.     precache_sound ("misc/water1.wav");
  91.     precache_sound ("misc/water2.wav");
  92. //** PATCH_END - flame thrower - Turrican ******
  93.  
  94. //** PATCH_BEGIN - lazsight - Turrican ****
  95.     precache_model ("progs/lazsight.mdl");
  96.     precache_sound ("weapons/lazsight.wav");
  97. //** PATCH_END - lazsight - Turrican ******
  98.  
  99. //** PATCH_BEGIN - tracbeam - Turrican ****
  100.     precache_sound ("weapons/beep1.wav");
  101. //** PATCH_END - tracbeam - Turrican ******
  102.  
  103. //** PATCH_BEGIN - throwing stuff - Turrican ****
  104. //** throwing powerups **
  105.     precache_model ("progs/quaddama.mdl");
  106.     precache_sound ("items/damage.wav");
  107.     precache_sound ("items/damage2.wav");
  108.     precache_sound ("items/damage3.wav");
  109.  
  110.     precache_model ("progs/invisibl.mdl");
  111.     precache_sound ("items/inv1.wav");
  112.     precache_sound ("items/inv2.wav");
  113.     precache_sound ("items/inv3.wav");
  114.  
  115.     precache_model ("progs/suit.mdl");
  116.     precache_sound ("items/suit.wav");
  117.     precache_sound ("items/suit2.wav");
  118.  
  119.     precache_model ("progs/invulner.mdl");
  120.     precache_sound ("items/protect.wav");
  121.     precache_sound ("items/protect2.wav");
  122.     precache_sound ("items/protect3.wav");
  123.  
  124. //** PATCH_END - throwing stuff - Turrucan ******
  125.  
  126. //** PATCH_BEGIN - morph2 ****
  127. //// Zombie morph
  128.     precache_model ("progs/zombie.mdl");
  129.     precache_model ("progs/h_zombie.mdl");
  130.     precache_model ("progs/zom_gib.mdl");
  131.  
  132.     precache_sound ("zombie/z_idle.wav");
  133.     precache_sound ("zombie/z_idle1.wav");
  134.     precache_sound ("zombie/z_shot1.wav");
  135.     precache_sound ("zombie/z_gib.wav");
  136.     precache_sound ("zombie/z_pain.wav");
  137.     precache_sound ("zombie/z_pain1.wav");
  138.     precache_sound ("zombie/z_fall.wav");
  139.     precache_sound ("zombie/z_miss.wav");
  140.     precache_sound ("zombie/z_hit.wav");
  141.     precache_sound ("zombie/idle_w2.wav");
  142. //** PATCH_BEGIN - morph2 - Turrican ****
  143.     precache_sound ("zombie/z_jump.wav");
  144.     precache_sound ("zombie/z_landpn.wav");
  145. //** PATCH_END - morph2 - Turrican ******
  146. ////
  147.  
  148. //// Shalrath morph
  149.     precache_model2 ("progs/shalrath.mdl");
  150.     precache_model2 ("progs/h_shal.mdl");
  151.     precache_model2 ("progs/v_spike.mdl");
  152.  
  153.     precache_sound2 ("shalrath/attack.wav");
  154.     precache_sound2 ("shalrath/attack2.wav");
  155.     precache_sound2 ("shalrath/death.wav");
  156.     precache_sound2 ("shalrath/idle.wav");
  157.     precache_sound2 ("shalrath/pain.wav");
  158.     precache_sound2 ("shalrath/sight.wav");
  159. //** PATCH_BEGIN - morph2 - Turrican ****
  160.     precache_sound ("shalrath/srlandpn.wav");
  161.     precache_sound ("shalrath/srjump.wav");
  162. //** PATCH_END - morph2 - Turrican ******
  163. ////
  164.  
  165. //// Wizard morph
  166.     precache_model ("progs/wizard.mdl");
  167.     precache_model ("progs/h_wizard.mdl");
  168.     precache_model ("progs/w_spike.mdl");
  169.  
  170.     precache_sound ("wizard/hit.wav");        // used by c code
  171.     precache_sound ("wizard/wattack.wav");
  172.     precache_sound ("wizard/wdeath.wav");
  173.     precache_sound ("wizard/widle1.wav");
  174.     precache_sound ("wizard/widle2.wav");
  175.     precache_sound ("wizard/wpain.wav");
  176.     precache_sound ("wizard/wsight.wav");
  177. //** PATCH_BEGIN - morph2 - Turrican ****
  178.     precache_sound ("wizard/wjump.wav");
  179.     precache_sound ("wizard/wlandpn.wav");
  180. //** PATCH_END - morph2 - Turrican ******
  181. ////
  182.  
  183. //// Hell knight morph
  184.     precache_model2 ("progs/hknight.mdl");
  185.     precache_model2 ("progs/k_spike.mdl");
  186.     precache_model2 ("progs/h_hellkn.mdl");
  187.  
  188.     precache_sound2 ("hknight/attack1.wav");
  189.     precache_sound2 ("hknight/death1.wav");
  190.     precache_sound2 ("hknight/pain1.wav");
  191.     precache_sound2 ("hknight/sight1.wav");
  192.     precache_sound ("hknight/hit.wav");        // used by C code, so don't sound2
  193.     precache_sound2 ("hknight/slash1.wav");
  194.     precache_sound2 ("hknight/idle.wav");
  195.     precache_sound2 ("hknight/grunt.wav");
  196.  
  197.     precache_sound ("knight/sword1.wav");
  198.     precache_sound ("knight/sword2.wav");
  199. //** PATCH_BEGIN - morph2 - Turrican ****
  200.     precache_sound ("hknight/hklandpn.wav");
  201.     precache_sound ("hknight/hkjump1.wav");
  202. //** PATCH_END - morph2 - Turrican ******
  203. ////
  204.  
  205. //// Shambler morph
  206.     precache_model ("progs/shambler.mdl");
  207.     precache_model ("progs/s_light.mdl");
  208.     precache_model ("progs/h_shams.mdl");
  209.     precache_model ("progs/bolt.mdl");
  210.  
  211.     precache_sound ("shambler/sattck1.wav");
  212.     precache_sound ("shambler/sboom.wav");
  213.     precache_sound ("shambler/sdeath.wav");
  214.     precache_sound ("shambler/shurt2.wav");
  215.     precache_sound ("shambler/sidle.wav");
  216.     precache_sound ("shambler/ssight.wav");
  217.     precache_sound ("shambler/melee1.wav");
  218.     precache_sound ("shambler/melee2.wav");
  219.     precache_sound ("shambler/smack.wav");
  220. //** PATCH_BEGIN - morph2 - Turrican ****
  221.     precache_sound ("shambler/slandpn.wav");
  222. //** PATCH_END - morph2 - Turrican ******
  223. ////
  224.  
  225. //// Demon morph
  226.     precache_model ("progs/demon.mdl");
  227.     precache_model ("progs/h_demon.mdl");
  228.  
  229.     precache_sound ("demon/ddeath.wav");
  230.     precache_sound ("demon/dhit2.wav");
  231.     precache_sound ("demon/djump.wav");
  232.     precache_sound ("demon/dpain1.wav");
  233.     precache_sound ("demon/idle1.wav");
  234.     precache_sound ("demon/sight2.wav");
  235. //** PATCH_BEGIN - morph2 - Turrican ****
  236.     precache_sound ("demon/dgrowl.wav");
  237.     precache_sound ("demon/dland2.wav");
  238.     precache_sound ("demon/dlandpai.wav");
  239. //** PATCH_END - morph2 - Turrican ******
  240. ////
  241.  
  242. //// Ogre morph
  243.     precache_model ("progs/ogre.mdl");
  244.     precache_model ("progs/h_ogre.mdl");
  245.     precache_model ("progs/grenade.mdl");
  246.  
  247.     precache_sound ("ogre/ogdrag.wav");
  248.     precache_sound ("ogre/ogdth.wav");
  249.     precache_sound ("ogre/ogidle.wav");
  250.     precache_sound ("ogre/ogidle2.wav");
  251.     precache_sound ("ogre/ogpain1.wav");
  252.     precache_sound ("ogre/ogsawatk.wav");
  253.     precache_sound ("ogre/ogwake.wav");
  254. //** PATCH_BEGIN - morph2 - Turrican ****
  255.     precache_sound ("ogre/oglandpn.wav");
  256. //** PATCH_END - morph2 - Turrican ******
  257. ////
  258. //** PATCH_END - morph2 ******
  259. };
  260.  
  261. float() crandom =
  262. {
  263.     return 2*(random() - 0.5);
  264. };
  265.  
  266. /*
  267. ================
  268. W_FireAxe
  269. ================
  270. */
  271. void() W_FireAxe =
  272. {
  273.     local    vector    source;
  274.     local    vector    org;
  275.  
  276.     source = self.origin + '0 0 16';
  277.     traceline (source, source + v_forward*64, FALSE, self);
  278.     if (trace_fraction == 1.0)
  279.         return;
  280.  
  281.     org = trace_endpos - v_forward*4;
  282.  
  283.     if (trace_ent.takedamage)
  284.     {
  285. //** PATCH_BEGIN - gibbin3 ****
  286.         // Some sort of thunking sound ...
  287.         sound (self, CHAN_WEAPON, "zombie/z_hit.wav", 1, ATTN_NORM);
  288. //** PATCH_END - gibbin3 ******
  289.         trace_ent.axhitme = 1;
  290.         SpawnBlood (org, '0 0 0', 20);
  291.         T_Damage (trace_ent, self, self, 20);
  292.     }
  293.     else
  294.     {    // hit wall
  295.         sound (self, CHAN_WEAPON, "player/axhit2.wav", 1, ATTN_NORM);
  296.         WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
  297.         WriteByte (MSG_BROADCAST, TE_GUNSHOT);
  298.         WriteCoord (MSG_BROADCAST, org_x);
  299.         WriteCoord (MSG_BROADCAST, org_y);
  300.         WriteCoord (MSG_BROADCAST, org_z);
  301.     }
  302. };
  303.  
  304.  
  305. //============================================================================
  306.  
  307.  
  308. vector() wall_velocity =
  309. {
  310.     local vector    vel;
  311.     
  312.     vel = normalize (self.velocity);
  313.     vel = normalize(vel + v_up*(random()- 0.5) + v_right*(random()- 0.5));
  314.     vel = vel + 2*trace_plane_normal;
  315.     vel = vel * 200;
  316.     
  317.     return vel;
  318. };
  319.  
  320.  
  321. /*
  322. ================
  323. SpawnMeatSpray
  324. ================
  325. */
  326. void(vector org, vector vel) SpawnMeatSpray =
  327. {
  328.     local    entity missile, mpuff;
  329.     local    vector    org;
  330.  
  331.     missile = spawn ();
  332.     missile.owner = self;
  333.     missile.movetype = MOVETYPE_BOUNCE;
  334.     missile.solid = SOLID_NOT;
  335.  
  336.     makevectors (self.angles);
  337.  
  338.     missile.velocity = vel;
  339.     missile.velocity_z = missile.velocity_z + 250 + 50*random();
  340.  
  341.     missile.avelocity = '3000 1000 2000';
  342.  
  343. // set missile duration
  344.     missile.nextthink = time + 1;
  345.     missile.think = SUB_Remove;
  346.  
  347.     setmodel (missile, "progs/zom_gib.mdl");
  348.     setsize (missile, '0 0 0', '0 0 0');
  349.     setorigin (missile, org);
  350. };
  351.  
  352. /*
  353. ================
  354. SpawnBlood
  355. ================
  356. */
  357. void(vector org, vector vel, float damage) SpawnBlood =
  358. {
  359.     particle (org, vel*0.1, 73, damage*2);
  360. };
  361.  
  362. /*
  363. ================
  364. spawn_touchblood
  365. ================
  366. */
  367. void(float damage) spawn_touchblood =
  368. {
  369.     local vector    vel;
  370.  
  371.     vel = wall_velocity () * 0.2;
  372.     SpawnBlood (self.origin + vel*0.01, vel, damage);
  373. };
  374.  
  375.  
  376. /*
  377. ================
  378. SpawnChunk
  379. ================
  380. */
  381. void(vector org, vector vel) SpawnChunk =
  382. {
  383.     particle (org, vel*0.02, 0, 10);
  384. };
  385.  
  386. /*
  387. ==============================================================================
  388.  
  389. MULTI-DAMAGE
  390.  
  391. Collects multiple small damages into a single damage
  392.  
  393. ==============================================================================
  394. */
  395.  
  396. entity    multi_ent;
  397. float    multi_damage;
  398.  
  399. void() ClearMultiDamage =
  400. {
  401.     multi_ent = world;
  402.     multi_damage = 0;
  403. };
  404.  
  405. void() ApplyMultiDamage =
  406. {
  407.     if (!multi_ent)
  408.         return;
  409.     T_Damage (multi_ent, self, self, multi_damage);
  410. };
  411.  
  412. void(entity hit, float damage) AddMultiDamage =
  413. {
  414.     if (!hit)
  415.         return;
  416.  
  417.     if (hit != multi_ent)
  418.     {
  419.         ApplyMultiDamage ();
  420.         multi_damage = damage;
  421.         multi_ent = hit;
  422.     }
  423.     else
  424.         multi_damage = multi_damage + damage;
  425. };
  426.  
  427. /*
  428. ==============================================================================
  429.  
  430. BULLETS
  431.  
  432. ==============================================================================
  433. */
  434.  
  435. /*
  436. ================
  437. TraceAttack
  438. ================
  439. */
  440. void(float damage, vector dir) TraceAttack =
  441. {
  442.     local    vector    vel, org;
  443.     
  444.     vel = normalize(dir + v_up*crandom() + v_right*crandom());
  445.     vel = vel + 2*trace_plane_normal;
  446.     vel = vel * 200;
  447.  
  448.     org = trace_endpos - dir*4;
  449.  
  450.     if (trace_ent.takedamage)
  451.     {
  452.         SpawnBlood (org, vel*0.2, damage);
  453.         AddMultiDamage (trace_ent, damage);
  454.     }
  455.     else
  456.     {
  457.         WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
  458.         WriteByte (MSG_BROADCAST, TE_GUNSHOT);
  459.         WriteCoord (MSG_BROADCAST, org_x);
  460.         WriteCoord (MSG_BROADCAST, org_y);
  461.         WriteCoord (MSG_BROADCAST, org_z);
  462.     }
  463. };
  464.  
  465. /*
  466. ================
  467. FireBullets
  468.  
  469. Used by shotgun, super shotgun, and enemy soldier firing
  470. Go to the trouble of combining multiple pellets into a single damage call.
  471. ================
  472. */
  473. void(float shotcount, vector dir, vector spread) FireBullets =
  474. {
  475.     local    vector direction;
  476.     local    vector    src;
  477.  
  478.     makevectors(self.v_angle);
  479.  
  480.     src = self.origin + v_forward*10;
  481.     src_z = self.absmin_z + self.size_z * 0.7;
  482.  
  483.     ClearMultiDamage ();
  484.     while (shotcount > 0)
  485.     {
  486.         direction = dir + crandom()*spread_x*v_right + crandom()*spread_y*v_up;
  487.  
  488.         traceline (src, src + direction*2048, FALSE, self);
  489.         if (trace_fraction != 1.0)
  490.             TraceAttack (4, direction);
  491.  
  492.         shotcount = shotcount - 1;
  493.     }
  494.     ApplyMultiDamage ();
  495. };
  496.  
  497. /*
  498. ================
  499. W_FireShotgun
  500. ================
  501. */
  502. void() W_FireShotgun =
  503. {
  504.     local vector dir;
  505.  
  506.     sound (self, CHAN_WEAPON, "weapons/guncock.wav", 1, ATTN_NORM);
  507.  
  508.     self.punchangle_x = -2;
  509.  
  510.     self.currentammo = self.ammo_shells = self.ammo_shells - 1;
  511.     dir = aim (self, 100000);
  512.     FireBullets (6, dir, '0.04 0.04 0');
  513. };
  514.  
  515.  
  516. /*
  517. ================
  518. W_FireSuperShotgun
  519. ================
  520. */
  521. void() W_FireSuperShotgun =
  522. {
  523.     local vector dir;
  524.  
  525.     if (self.currentammo == 1)
  526.     {
  527.         W_FireShotgun ();
  528.         return;
  529.     }
  530.  
  531.     sound (self ,CHAN_WEAPON, "weapons/shotgn2.wav", 1, ATTN_NORM);
  532.  
  533.     self.punchangle_x = -4;
  534.  
  535.     self.currentammo = self.ammo_shells = self.ammo_shells - 2;
  536.     dir = aim (self, 100000);
  537.     FireBullets (14, dir, '0.14 0.08 0');
  538. };
  539.  
  540. //** PATCH_BEGIN - tchwpn10 - Turrican ****
  541. /*
  542. ==============================================================================
  543.  
  544. LASERS
  545.  
  546. ==============================================================================
  547. */
  548.  
  549. /*
  550. ================
  551. W_FireLaser
  552. ================
  553. */
  554. void() W_FireLaser =
  555. {
  556.     local vector dir, org;
  557.  
  558.     sound(self, CHAN_WEAPON, "enforcer/enfire.wav", 1, ATTN_NORM);
  559.     org = self.origin + v_forward * 8 + '0 0 16';
  560.     self.punchangle_x = -1;
  561.  
  562.     self.currentammo = self.ammo_cells = self.ammo_cells - 1;
  563.     dir = aim (self, 100000);
  564.     LaunchLaser(org, dir);
  565. };
  566.  
  567.  
  568. /*
  569. ================
  570. W_FireSuperLaser
  571. ================
  572. */
  573. void() W_FireSuperLaser =
  574. {
  575.     local vector dir, orgleft, orgright;
  576.  
  577.     if (self.currentammo == 1)
  578.     {
  579.         W_FireLaser ();
  580.         return;
  581.     }
  582.  
  583.     sound(self, CHAN_WEAPON, "enforcer/enfire.wav", 1, ATTN_NORM);
  584.     self.punchangle_x = CONTENT_SOLID;
  585.     orgleft = self.origin + v_forward * 8 - v_right + '0 0 16';
  586.     orgright = self.origin + v_forward * 8 + v_right + '0 0 16';
  587.  
  588.     self.currentammo = self.ammo_cells = self.ammo_cells - 2;
  589.     dir = aim (self, 10000);
  590.     LaunchLaser(orgleft, dir);
  591.     LaunchLaser(orgright, dir);
  592. };
  593. //** PATCH_END - tchwpn10 - Turrican ******
  594.  
  595. /*
  596. ==============================================================================
  597.  
  598. ROCKETS
  599.  
  600. ==============================================================================
  601. */
  602.  
  603. void()    s_explode1    =    [0,        s_explode2] {};
  604. void()    s_explode2    =    [1,        s_explode3] {};
  605. void()    s_explode3    =    [2,        s_explode4] {};
  606. void()    s_explode4    =    [3,        s_explode5] {};
  607. void()    s_explode5    =    [4,        s_explode6] {};
  608. void()    s_explode6    =    [5,        SUB_Remove] {};
  609.  
  610. void() BecomeExplosion =
  611. {
  612.     self.movetype = MOVETYPE_NONE;
  613.     self.velocity = '0 0 0';
  614.     self.touch = SUB_Null;
  615.     setmodel (self, "progs/s_explod.spr");
  616.     self.solid = SOLID_NOT;
  617.     s_explode1 ();
  618. };
  619.  
  620. void() T_MissileTouch =
  621. {
  622.     local float    damg;
  623.  
  624.     if (other == self.owner)
  625.         return;        // don't explode on owner
  626.  
  627.     if (pointcontents(self.origin) == CONTENT_SKY)
  628.     {
  629.         remove(self);
  630.         return;
  631.     }
  632.  
  633.     damg = 100 + random()*20;
  634.     
  635.     if (other.health)
  636.     {
  637.         if (other.classname == "monster_shambler")
  638.             damg = damg * 0.5;    // mostly immune
  639.         T_Damage (other, self, self.owner, damg );
  640.     }
  641.  
  642.     // don't do radius damage to the other, because all the damage
  643.     // was done in the impact
  644.     T_RadiusDamage (self, self.owner, 120, other);
  645.  
  646. //    sound (self, CHAN_WEAPON, "weapons/r_exp3.wav", 1, ATTN_NORM);
  647.     self.origin = self.origin - 8*normalize(self.velocity);
  648.  
  649.     WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
  650.     WriteByte (MSG_BROADCAST, TE_EXPLOSION);
  651.     WriteCoord (MSG_BROADCAST, self.origin_x);
  652.     WriteCoord (MSG_BROADCAST, self.origin_y);
  653.     WriteCoord (MSG_BROADCAST, self.origin_z);
  654.  
  655.     BecomeExplosion ();
  656. };
  657.  
  658.  
  659.  
  660. /*
  661. ================
  662. W_FireRocket
  663. ================
  664. */
  665. void() W_FireRocket =
  666. {
  667.     local    entity missile, mpuff;
  668.     
  669.     self.currentammo = self.ammo_rockets = self.ammo_rockets - 1;
  670.     
  671.     sound (self, CHAN_WEAPON, "weapons/sgun1.wav", 1, ATTN_NORM);
  672.  
  673.     self.punchangle_x = -2;
  674.  
  675.     missile = spawn ();
  676.     missile.owner = self;
  677.     missile.movetype = MOVETYPE_FLYMISSILE;
  678.     missile.solid = SOLID_BBOX;
  679.  
  680. // set missile speed    
  681.  
  682.     makevectors (self.v_angle);
  683.     missile.velocity = aim(self, 1000);
  684.     missile.velocity = missile.velocity * 1000;
  685.     missile.angles = vectoangles(missile.velocity);
  686.     
  687.     missile.touch = T_MissileTouch;
  688.     
  689. // set missile duration
  690.     missile.nextthink = time + 5;
  691.     missile.think = SUB_Remove;
  692.  
  693.     setmodel (missile, "progs/missile.mdl");
  694.     setsize (missile, '0 0 0', '0 0 0');        
  695.     setorigin (missile, self.origin + v_forward*8 + '0 0 16');
  696. };
  697.  
  698. /*
  699. ===============================================================================
  700.  
  701. LIGHTNING
  702.  
  703. ===============================================================================
  704. */
  705.  
  706. /*
  707. =================
  708. LightningDamage
  709. =================
  710. */
  711. void(vector p1, vector p2, entity from, float damage) LightningDamage =
  712. {
  713.     local entity        e1, e2;
  714.     local vector        f;
  715.     
  716.     f = p2 - p1;
  717.     normalize (f);
  718.     f_x = 0 - f_y;
  719.     f_y = f_x;
  720.     f_z = 0;
  721.     f = f*16;
  722.  
  723.     e1 = e2 = world;
  724.  
  725.     traceline (p1, p2, FALSE, self);
  726.     if (trace_ent.takedamage)
  727.     {
  728.         particle (trace_endpos, '0 0 100', 225, damage*4);
  729.         T_Damage (trace_ent, from, from, damage);
  730.         if (self.classname == "player")
  731.         {
  732.             if (other.classname == "player")
  733.                 trace_ent.velocity_z = trace_ent.velocity_z + 400;
  734.         }
  735.     }
  736.     e1 = trace_ent;
  737.  
  738.     traceline (p1 + f, p2 + f, FALSE, self);
  739.     if (trace_ent != e1 && trace_ent.takedamage)
  740.     {
  741.         particle (trace_endpos, '0 0 100', 225, damage*4);
  742.         T_Damage (trace_ent, from, from, damage);
  743.     }
  744.     e2 = trace_ent;
  745.  
  746.     traceline (p1 - f, p2 - f, FALSE, self);
  747.     if (trace_ent != e1 && trace_ent != e2 && trace_ent.takedamage)
  748.     {
  749.         particle (trace_endpos, '0 0 100', 225, damage*4);
  750.         T_Damage (trace_ent, from, from, damage);
  751.     }
  752. };
  753.  
  754.  
  755. void() W_FireLightning =
  756. {
  757.     local    vector        org;
  758.  
  759.     if (self.ammo_cells < 1)
  760.     {
  761.         self.weapon = W_BestWeapon ();
  762.         W_SetCurrentAmmo ();
  763.         return;
  764.     }
  765.  
  766. // explode if under water
  767.     if (self.waterlevel > 1)
  768.     {
  769.         T_RadiusDamage (self, self, 35*self.ammo_cells, world);
  770.         self.ammo_cells = 0;
  771.         W_SetCurrentAmmo ();
  772.         return;
  773.     }
  774.  
  775.     if (self.t_width < time)
  776.     {
  777.         sound (self, CHAN_WEAPON, "weapons/lhit.wav", 1, ATTN_NORM);
  778.         self.t_width = time + 0.6;
  779.     }
  780.     self.punchangle_x = -2;
  781.  
  782.     self.currentammo = self.ammo_cells = self.ammo_cells - 1;
  783.  
  784.     org = self.origin + '0 0 16';
  785.     
  786.     traceline (org, org + v_forward*600, TRUE, self);
  787.  
  788.     WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
  789.     WriteByte (MSG_BROADCAST, TE_LIGHTNING2);
  790.     WriteEntity (MSG_BROADCAST, self);
  791.     WriteCoord (MSG_BROADCAST, org_x);
  792.     WriteCoord (MSG_BROADCAST, org_y);
  793.     WriteCoord (MSG_BROADCAST, org_z);
  794.     WriteCoord (MSG_BROADCAST, trace_endpos_x);
  795.     WriteCoord (MSG_BROADCAST, trace_endpos_y);
  796.     WriteCoord (MSG_BROADCAST, trace_endpos_z);
  797.  
  798.     LightningDamage (self.origin, trace_endpos + v_forward*4, self, 30);
  799. };
  800.  
  801.  
  802. //=============================================================================
  803.  
  804.  
  805. void() GrenadeExplode =
  806. {
  807.     T_RadiusDamage (self, self.owner, 120, world);
  808.  
  809.     WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
  810.     WriteByte (MSG_BROADCAST, TE_EXPLOSION);
  811.     WriteCoord (MSG_BROADCAST, self.origin_x);
  812.     WriteCoord (MSG_BROADCAST, self.origin_y);
  813.     WriteCoord (MSG_BROADCAST, self.origin_z);
  814.  
  815.     BecomeExplosion ();
  816. };
  817.  
  818. void() GrenadeTouch =
  819. {
  820.     if (other == self.owner)
  821.         return;        // don't explode on owner
  822.     if (other.takedamage == DAMAGE_AIM)
  823.     {
  824.         GrenadeExplode();
  825.         return;
  826.     }
  827.  
  828. //** PATCH_BEGIN - gibbin3 - Turrican ****
  829.     if (other.classname == "corpse" ||
  830.         other.classname == "gib" ||
  831.         other.classname == "gib_head")
  832.     {
  833.         sound (self, CHAN_WEAPON, "zombie/z_hit.wav", 1, ATTN_NORM);    // bounce on corpse sound
  834.     }
  835.     else
  836.     {
  837.         sound (self, CHAN_WEAPON, "weapons/bounce.wav", 1, ATTN_NORM);    // bounce sound
  838.     }
  839. //** PATCH_END - gibbin3 - Turrican ******
  840.  
  841.     if (self.velocity == '0 0 0')
  842.         self.avelocity = '0 0 0';
  843. };
  844.  
  845. /*
  846. ================
  847. W_FireGrenade
  848. ================
  849. */
  850. void() W_FireGrenade =
  851. {
  852.     local    entity missile, mpuff;
  853.  
  854.     self.currentammo = self.ammo_rockets = self.ammo_rockets - 1;
  855.  
  856.     sound (self, CHAN_WEAPON, "weapons/grenade.wav", 1, ATTN_NORM);
  857.  
  858.     self.punchangle_x = -2;
  859.  
  860.     missile = spawn ();
  861.     missile.owner = self;
  862.     missile.movetype = MOVETYPE_BOUNCE;
  863.     missile.solid = SOLID_BBOX;
  864.     missile.classname = "grenade";
  865.  
  866. // set missile speed
  867.  
  868.     makevectors (self.v_angle);
  869.  
  870.     if (self.v_angle_x)
  871.         missile.velocity = v_forward*600 + v_up * 200 + crandom()*v_right*10 + crandom()*v_up*10;
  872.     else
  873.     {
  874.         missile.velocity = aim(self, 10000);
  875.         missile.velocity = missile.velocity * 600;
  876.         missile.velocity_z = 200;
  877.     }
  878.  
  879.     missile.avelocity = '300 300 300';
  880.  
  881.     missile.angles = vectoangles(missile.velocity);
  882.  
  883.     missile.touch = GrenadeTouch;
  884.  
  885. // set missile duration
  886. //** PATCH_BEGIN - grenades - Turrican ****
  887.     missile.nextthink = time + self.grenade_time;
  888. //** PATCH_END - grenades - Turrican ******
  889.     missile.think = GrenadeExplode;
  890.  
  891.     setmodel (missile, "progs/grenade.mdl");
  892.     setsize (missile, '0 0 0', '0 0 0');
  893.     setorigin (missile, self.origin);
  894. };
  895.  
  896. //** PATCH_BEGIN - pipebombs ****
  897. //Detonate all pipebombs
  898. void() DetPipeBombs =
  899. {
  900.     local entity    head;
  901.  
  902.     head = find (world,classname,"pipebomb");
  903.     while(head)
  904.     {
  905.         if(head.owner == self)
  906.         head.nextthink = time;
  907.         head = find (head,classname,"pipebomb");
  908.     }
  909. };
  910.  
  911. void() PipeBombTouch =
  912. {
  913.     if (other == self.owner)
  914.         return;        // don't explode on owner
  915.     sound (self, CHAN_WEAPON, "weapons/bounce.wav", 1, ATTN_NORM);    // bounce sound
  916.     if (self.velocity == '0 0 0')
  917.         self.avelocity = '0 0 0';
  918. };
  919.  
  920. void() W_FirePipeBomb =
  921. {
  922.     local    entity missile, mpuff;
  923.     if(self.ammo_rockets < 1)    // have to have ammo
  924.       return;
  925.     self.currentammo = self.ammo_rockets = self.ammo_rockets - 1;
  926.     self.punchangle_x=-2;
  927.     missile = spawn ();
  928.     missile.owner = self;
  929.     missile.movetype = MOVETYPE_BOUNCE;
  930.     missile.solid = SOLID_BBOX;
  931.     missile.classname = "pipebomb";
  932.     makevectors (self.v_angle);
  933.     if (self.v_angle_x) missile.velocity =
  934.     v_forward*600 + v_up * 200 + crandom()*v_right*10 + crandom()*v_up*10;
  935.     else {
  936.         missile.velocity = aim(self, 10000);
  937.         missile.velocity = missile.velocity * 600;
  938.         missile.velocity_z = 200;
  939.     }
  940.     missile.avelocity = '300 300 300';
  941.     missile.angles = vectoangles(missile.velocity);
  942.     missile.touch = PipeBombTouch;
  943.     missile.think = GrenadeExplode;
  944.     sound (self, CHAN_WEAPON, "weapons/grenade.wav", 1, ATTN_NORM);
  945.     setmodel (missile, "progs/grenade.mdl");
  946.     setsize (missile, '0 0 0', '0 0 0');
  947.     setorigin (missile, self.origin);
  948.     //pipe bombs explode after 5 mins by default
  949.     missile.nextthink=time+300;
  950. };
  951. //** PATCH_END - pipebombs ****
  952.  
  953. //=============================================================================
  954.  
  955. void() spike_touch;
  956. void() superspike_touch;
  957.  
  958.  
  959. /*
  960. ===============
  961. launch_spike
  962.  
  963. Used for both the player and the ogre
  964. ===============
  965. */
  966. void(vector org, vector dir) launch_spike =
  967. {
  968.     newmis = spawn ();
  969.     newmis.owner = self;
  970.     newmis.movetype = MOVETYPE_FLYMISSILE;
  971.     newmis.solid = SOLID_BBOX;
  972.  
  973.     newmis.angles = vectoangles(dir);
  974.     
  975.     newmis.touch = spike_touch;
  976.     newmis.classname = "spike";
  977.     newmis.think = SUB_Remove;
  978.     newmis.nextthink = time + 6;
  979.     setmodel (newmis, "progs/spike.mdl");
  980.     setsize (newmis, VEC_ORIGIN, VEC_ORIGIN);
  981.     setorigin (newmis, org);
  982.  
  983.     newmis.velocity = dir * 1000;
  984. };
  985.  
  986. void() W_FireSuperSpikes =
  987. {
  988.     local vector    dir;
  989.     local entity    old;
  990.     
  991.     sound (self, CHAN_WEAPON, "weapons/spike2.wav", 1, ATTN_NORM);
  992.     self.attack_finished = time + 0.2;
  993.     self.currentammo = self.ammo_nails = self.ammo_nails - 2;
  994.     dir = aim (self, 1000);
  995.     launch_spike (self.origin + '0 0 16', dir);
  996.     newmis.touch = superspike_touch;
  997.     setmodel (newmis, "progs/s_spike.mdl");
  998.     setsize (newmis, VEC_ORIGIN, VEC_ORIGIN);        
  999.     self.punchangle_x = -2;
  1000. };
  1001.  
  1002. void(float ox) W_FireSpikes =
  1003. {
  1004.     local vector    dir;
  1005.     local entity    old;
  1006.     
  1007.     makevectors (self.v_angle);
  1008.  
  1009.     if (self.ammo_nails >= 2 && self.weapon == IT_SUPER_NAILGUN)
  1010.     {
  1011.         W_FireSuperSpikes ();
  1012.         return;
  1013.     }
  1014.  
  1015.     if (self.ammo_nails < 1)
  1016.     {
  1017.         self.weapon = W_BestWeapon ();
  1018.         W_SetCurrentAmmo ();
  1019.         return;
  1020.     }
  1021.  
  1022.     sound (self, CHAN_WEAPON, "weapons/rocket1i.wav", 1, ATTN_NORM);
  1023.     self.attack_finished = time + 0.2;
  1024.     self.currentammo = self.ammo_nails = self.ammo_nails - 1;
  1025.     dir = aim (self, 1000);
  1026.     launch_spike (self.origin + '0 0 16' + v_right*ox, dir);
  1027.  
  1028.     self.punchangle_x = -2;
  1029. };
  1030.  
  1031.  
  1032.  
  1033. .float hit_z;
  1034. void() spike_touch =
  1035. {
  1036. local float rand;
  1037.     if (other == self.owner)
  1038.         return;
  1039.  
  1040.     if (other.solid == SOLID_TRIGGER)
  1041.         return;    // trigger field, do nothing
  1042.  
  1043.     if (pointcontents(self.origin) == CONTENT_SKY)
  1044.     {
  1045.         remove(self);
  1046.         return;
  1047.     }
  1048.     
  1049. // hit something that bleeds
  1050.     if (other.takedamage)
  1051.     {
  1052.         spawn_touchblood (9);
  1053.         T_Damage (other, self, self.owner, 9);
  1054.     }
  1055.     else
  1056.     {
  1057.         WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
  1058.         
  1059.         if (self.classname == "wizspike")
  1060.             WriteByte (MSG_BROADCAST, TE_WIZSPIKE);
  1061.         else if (self.classname == "knightspike")
  1062.             WriteByte (MSG_BROADCAST, TE_KNIGHTSPIKE);
  1063.         else
  1064.             WriteByte (MSG_BROADCAST, TE_SPIKE);
  1065.         WriteCoord (MSG_BROADCAST, self.origin_x);
  1066.         WriteCoord (MSG_BROADCAST, self.origin_y);
  1067.         WriteCoord (MSG_BROADCAST, self.origin_z);
  1068.     }
  1069.  
  1070.     remove(self);
  1071.  
  1072. };
  1073.  
  1074. void() superspike_touch =
  1075. {
  1076. local float rand;
  1077.     if (other == self.owner)
  1078.         return;
  1079.  
  1080.     if (other.solid == SOLID_TRIGGER)
  1081.         return;    // trigger field, do nothing
  1082.  
  1083.     if (pointcontents(self.origin) == CONTENT_SKY)
  1084.     {
  1085.         remove(self);
  1086.         return;
  1087.     }
  1088.     
  1089. // hit something that bleeds
  1090.     if (other.takedamage)
  1091.     {
  1092.         spawn_touchblood (18);
  1093.         T_Damage (other, self, self.owner, 18);
  1094.     }
  1095.     else
  1096.     {
  1097.         WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
  1098.         WriteByte (MSG_BROADCAST, TE_SUPERSPIKE);
  1099.         WriteCoord (MSG_BROADCAST, self.origin_x);
  1100.         WriteCoord (MSG_BROADCAST, self.origin_y);
  1101.         WriteCoord (MSG_BROADCAST, self.origin_z);
  1102.     }
  1103.  
  1104.     remove(self);
  1105.  
  1106. };
  1107.  
  1108.  
  1109. /*
  1110. ===============================================================================
  1111.  
  1112. PLAYER WEAPON USE
  1113.  
  1114. ===============================================================================
  1115. */
  1116.  
  1117. void() W_SetCurrentAmmo =
  1118. {
  1119.     player_run ();        // get out of any weapon firing states
  1120.  
  1121.     self.items = self.items - ( self.items & (IT_SHELLS | IT_NAILS | IT_ROCKETS | IT_CELLS) );
  1122.  
  1123.     if (self.weapon == IT_AXE)
  1124.     {
  1125.         self.currentammo = 0;
  1126.         self.weaponmodel = "progs/v_axe.mdl";
  1127.         self.weaponframe = 0;
  1128.     }
  1129.  
  1130. //** PATCH_BEGIN - throwaxe ****
  1131.     else if (self.weapon == IT_THROWING_AXE)
  1132.     {
  1133.         self.currentammo = self.num_axes;
  1134.         self.weaponmodel = "progs/v_axe.mdl";
  1135.         self.weaponframe = 0;
  1136.     }
  1137. //** PATCH_END - throwaxe ******
  1138.  
  1139. //** PATCH_BEGIN - grap109b ****
  1140.     else if (self.weapon == IT_MORNINGSTAR)
  1141.     {
  1142.         self.currentammo = 0;
  1143.         self.weaponmodel = "progs/v_star.mdl";
  1144.         self.weaponframe = 0;
  1145.     }
  1146. //** PATCH_END - grap109b ******
  1147.  
  1148.     else if (self.weapon == IT_SHOTGUN)
  1149.     {
  1150.         self.currentammo = self.ammo_shells;
  1151.         self.weaponmodel = "progs/v_shot.mdl";
  1152.         self.weaponframe = 0;
  1153.         self.items = self.items | IT_SHELLS;
  1154.     }
  1155.     else if (self.weapon == IT_SUPER_SHOTGUN)
  1156.     {
  1157.         self.currentammo = self.ammo_shells;
  1158.         self.weaponmodel = "progs/v_shot2.mdl";
  1159.         self.weaponframe = 0;
  1160.         self.items = self.items | IT_SHELLS;
  1161.     }
  1162. //** PATCH_BEGIN - tchwpn10 - Turrican ****
  1163.     else if (self.weapon == IT_LASER)
  1164.     {
  1165.         self.currentammo = self.ammo_cells;
  1166.         self.weaponmodel = "progs/v_laser.mdl";
  1167.         self.weaponframe = 0;
  1168.         self.items = self.items | IT_CELLS;
  1169.     }
  1170.     else if (self.weapon == IT_SUPER_LASER)
  1171.     {
  1172.         self.currentammo = self.ammo_cells;
  1173.         self.weaponmodel = "progs/v_laser2.mdl";
  1174.         self.weaponframe = 0;
  1175.         self.items = self.items | IT_CELLS;
  1176.     }
  1177. //** PATCH_END - tchwpn10 - Turrican ******
  1178.     else if (self.weapon == IT_NAILGUN)
  1179.     {
  1180.         self.currentammo = self.ammo_nails;
  1181.         self.weaponmodel = "progs/v_nail.mdl";
  1182.         self.weaponframe = 0;
  1183.         self.items = self.items | IT_NAILS;
  1184.     }
  1185.     else if (self.weapon == IT_SUPER_NAILGUN)
  1186.     {
  1187.         self.currentammo = self.ammo_nails;
  1188.         self.weaponmodel = "progs/v_nail2.mdl";
  1189.         self.weaponframe = 0;
  1190.         self.items = self.items | IT_NAILS;
  1191.     }
  1192.     else if (self.weapon == IT_GRENADE_LAUNCHER)
  1193.     {
  1194.         self.currentammo = self.ammo_rockets;
  1195.         self.weaponmodel = "progs/v_rock.mdl";
  1196.         self.weaponframe = 0;
  1197.         self.items = self.items | IT_ROCKETS;
  1198.     }
  1199. //** PATCH_BEGIN - pipebombs - Turrican ****
  1200.     else if (self.weapon == IT_PIPE_BOMBS)
  1201.     {
  1202.         self.currentammo = self.ammo_rockets;
  1203.         self.weaponmodel = "progs/v_pipe.mdl";
  1204.         self.weaponframe = 0;
  1205.         self.items = self.items | IT_ROCKETS;
  1206.     }
  1207. //** PATCH_END - pipebombs - Turrican ******
  1208.     else if (self.weapon == IT_ROCKET_LAUNCHER)
  1209.     {
  1210.         self.currentammo = self.ammo_rockets;
  1211.         self.weaponmodel = "progs/v_rock2.mdl";
  1212.         self.weaponframe = 0;
  1213.         self.items = self.items | IT_ROCKETS;
  1214.     }
  1215. //** PATCH_BEGIN - flame thrower - Turrican ****
  1216.         else if (self.weapon == IT_FLAMETHROWER)
  1217.     {
  1218.         self.currentammo = self.ammo_rockets;
  1219.         self.weaponmodel = "progs/v_flame.mdl";
  1220.         self.weaponframe = 0;
  1221.         self.items = self.items | IT_ROCKETS;
  1222.     }
  1223. //** PATCH_END - flame thrower - Turrican ******
  1224.     else if (self.weapon == IT_LIGHTNING)
  1225.     {
  1226.         self.currentammo = self.ammo_cells;
  1227.         self.weaponmodel = "progs/v_light.mdl";
  1228.         self.weaponframe = 0;
  1229.         self.items = self.items | IT_CELLS;
  1230.     }
  1231. //** PATCH_BEGIN - tracbeam - Turrican ****
  1232.     else if (self.weapon == IT_TRACTOR_BEAM)
  1233.     {
  1234.         self.currentammo = self.ammo_cells;
  1235.         self.weaponmodel = "progs/v_light.mdl";
  1236.         self.weaponframe = 0;
  1237.         self.items = self.items | IT_CELLS;
  1238.     }
  1239. //** PATCH_END - tracbeam - Turrican ******
  1240.     else
  1241.     {
  1242.         self.currentammo = 0;
  1243.         self.weaponmodel = "";
  1244.         self.weaponframe = 0;
  1245.     }
  1246. };
  1247.  
  1248. float() W_BestWeapon =
  1249. {
  1250.     local    float    it;
  1251. //** PATCH_BEGIN - extra weapons - Turrican ****
  1252.     local    float    extra_it;
  1253.  
  1254.     extra_it = self.extra_items;
  1255. //** PATCH_END - extra weapons - Turrican ******
  1256.  
  1257.     it = self.items;
  1258.  
  1259. //** PATCH_BEGIN - throwaxe ****
  1260.     if(self.num_axes == 0 && self.weapon == IT_THROWING_AXE)
  1261.         return IT_AXE;
  1262.     else if(self.ammo_cells >= 1 && (it & IT_LIGHTNING) )
  1263. //** PATCH_END - throwaxe ******
  1264.         return IT_LIGHTNING;
  1265.     else if(self.ammo_nails >= 2 && (it & IT_SUPER_NAILGUN) )
  1266.         return IT_SUPER_NAILGUN;
  1267. //** PATCH_BEGIN - flame thrower - Turrican ****
  1268.     else if(self.ammo_rockets >= 1 &&
  1269.            (extra_it & EXTRA_FLAMETHROWER)&&
  1270.            (it & IT_ROCKET_LAUNCHER) )
  1271.         return IT_FLAMETHROWER;
  1272. //** PATCH_END - flame thrower - Turrican ******
  1273.     else if(self.ammo_shells >= 2 && (it & IT_SUPER_SHOTGUN) )
  1274.         return IT_SUPER_SHOTGUN;
  1275.     else if(self.ammo_nails >= 1 && (it & IT_NAILGUN) )
  1276.         return IT_NAILGUN;
  1277. //** PATCH_BEGIN - tchwpn10 - Turrican ****
  1278.     else if(self.ammo_cells >= 2 &&
  1279.            (extra_it & EXTRA_SUPER_LASER) &&
  1280.            (it & IT_SUPER_SHOTGUN) )
  1281.         return IT_SUPER_LASER;
  1282.     else if(self.ammo_cells >= 1 && (extra_it & EXTRA_LASER) )
  1283.         return IT_LASER;
  1284. //** PATCH_END - tchwpn10 - Turrican ******
  1285.     else if(self.ammo_shells >= 1 && (it & IT_SHOTGUN) )
  1286.         return IT_SHOTGUN;
  1287. //** PATCH_BEGIN - throwaxe - Turrican ****
  1288.     else if(self.num_axes >= 1 && (extra_it & EXTRA_THROWING_AXE) )
  1289.         return IT_THROWING_AXE;
  1290. //** PATCH_END - throwaxe - Turrican ******
  1291.  
  1292. /*
  1293.     if(self.ammo_rockets >= 1 && (it & IT_ROCKET_LAUNCHER) )
  1294.         return IT_ROCKET_LAUNCHER;
  1295.     else if(self.ammo_rockets >= 1 && (it & IT_GRENADE_LAUNCHER) )
  1296.         return IT_GRENADE_LAUNCHER;
  1297. //** PATCH_BEGIN - pipebombs - Turrican ****
  1298.     else if(self.ammo_rockets >= 1 &&
  1299.            (extra_it & EXTRA_PIPE_BOMBS) &&
  1300.            (it & IT_GRENADE_LAUNCHER) )
  1301.         return IT_PIPE_BOMBS;
  1302. //** PATCH_END - pipebombs - Turrican ******
  1303. //** PATCH_BEGIN - tracbeam - Turrican ****
  1304.     else if(self.ammo_cells >= 1 &&
  1305.            (extra_it & EXTRA_PIPE_BOMBS) &&
  1306.            (it & IT_LIGHTNING) )
  1307.         return IT_TRACTOR_BEAM;
  1308. //** PATCH_END - tracbeam - Turrican ******
  1309. */
  1310.  
  1311. //** PATCH_BEGIN - grap109b ****
  1312.     return IT_MORNINGSTAR;
  1313. //** PATCH_END - grap109b ******
  1314. };
  1315.  
  1316. float() W_CheckNoAmmo =
  1317. {
  1318.     if (self.currentammo > 0)
  1319.         return TRUE;
  1320.  
  1321.     if (self.weapon == IT_AXE)
  1322.         return TRUE;
  1323.  
  1324. //** PATCH_BEGIN - grap109b ****
  1325.     if (self.weapon == IT_MORNINGSTAR)
  1326.         return TRUE;
  1327. //** PATCH_END - grap109b ******
  1328.  
  1329.     self.weapon = W_BestWeapon ();
  1330.  
  1331.     W_SetCurrentAmmo ();
  1332.  
  1333. // drop the weapon down
  1334.     return FALSE;
  1335. };
  1336.  
  1337. /*
  1338. ============
  1339. W_Attack
  1340.  
  1341. An attack impulse can be triggered now
  1342. ============
  1343. */
  1344. void()    player_axe1;
  1345. void()    player_axeb1;
  1346. void()    player_axec1;
  1347. void()    player_axed1;
  1348. void()    player_shot1;
  1349. void()    player_nail1;
  1350. void()    player_light1;
  1351. void()    player_rocket1;
  1352. //** PATCH_BEGIN - grap109b ****
  1353. void()    player_chain1;
  1354. void()  player_chain3;
  1355. //** PATCH_END - grap109b ******
  1356. //** PATCH_BEGIN - throwaxe ****
  1357. void() player_tax1;
  1358. //** PATCH_END - throwaxe ******
  1359.  
  1360. void() W_Attack =
  1361. {
  1362.     local    float    r;
  1363.  
  1364. //** PATCH_BEGIN - morph2 ****
  1365.     if (self._attack != SUB_Null)
  1366.     {
  1367.         self._attack();
  1368.         return;
  1369.     }
  1370. //** PATCH_END - morph2 ******
  1371.  
  1372.     if (!W_CheckNoAmmo ())
  1373.         return;
  1374.  
  1375.     makevectors    (self.v_angle);            // calculate forward angle for velocity
  1376.     self.show_hostile = time + 1;    // wake monsters up
  1377.  
  1378.     if (self.weapon == IT_AXE)
  1379.     {
  1380.         sound (self, CHAN_WEAPON, "weapons/ax1.wav", 1, ATTN_NORM);
  1381.         r = random();
  1382.         if (r < 0.25)
  1383.             player_axe1 ();
  1384.         else if (r<0.5)
  1385.             player_axeb1 ();
  1386.         else if (r<0.75)
  1387.             player_axec1 ();
  1388.         else
  1389.             player_axed1 ();
  1390.         self.attack_finished = time + 0.5;
  1391.     }
  1392.  
  1393. //** PATCH_BEGIN - throwaxe ****
  1394.     else if (self.weapon == IT_THROWING_AXE)
  1395.     {
  1396.         player_tax1 ();
  1397.         self.attack_finished = time + 1;
  1398.     }
  1399. //** PATCH_END - throwaxe ******
  1400.  
  1401. //** PATCH_BEGIN - grap109b ****
  1402.     else if (self.weapon == IT_MORNINGSTAR)
  1403.     {
  1404.         if (!self.hook_out)
  1405.         {
  1406.             player_chain1();
  1407.         }
  1408.         else
  1409.         {
  1410.             player_chain3();
  1411.         }
  1412.         self.attack_finished = time + 0.1;
  1413.     }
  1414. //** PATCH_END - grap109b ******
  1415.     else if (self.weapon == IT_SHOTGUN)
  1416.     {
  1417.         player_shot1 ();
  1418.         W_FireShotgun ();
  1419.         self.attack_finished = time + 0.5;
  1420.     }
  1421.     else if (self.weapon == IT_SUPER_SHOTGUN)
  1422.     {
  1423.         player_shot1 ();
  1424.         W_FireSuperShotgun ();
  1425.         self.attack_finished = time + 0.7;
  1426.     }
  1427. //** PATCH_BEGIN - tchwpn10 - Turrican ****
  1428.     else if (self.weapon == IT_LASER)
  1429.     {
  1430.         player_shot1 ();
  1431.         W_FireLaser ();
  1432.         self.attack_finished = time + 0.25;
  1433.     }
  1434.     else if (self.weapon == IT_SUPER_LASER)
  1435.     {
  1436.         player_shot1 ();
  1437.         W_FireSuperLaser ();
  1438.         self.attack_finished = time + 0.5;
  1439.     }
  1440. //** PATCH_END - tchwpn10 - Turrican ******
  1441.     else if (self.weapon == IT_NAILGUN)
  1442.     {
  1443.         player_nail1 ();
  1444.     }
  1445.     else if (self.weapon == IT_SUPER_NAILGUN)
  1446.     {
  1447.         player_nail1 ();
  1448.     }
  1449.     else if (self.weapon == IT_GRENADE_LAUNCHER)
  1450.     {
  1451.         player_rocket1();
  1452.         W_FireGrenade();
  1453.         self.attack_finished = time + 0.6;
  1454.     }
  1455. //** PATCH_BEGIN - pipebombs ****
  1456.     else if (self.weapon == IT_PIPE_BOMBS)
  1457.     {
  1458.         player_rocket1();
  1459.         W_FirePipeBomb();
  1460.         self.attack_finished = time + 0.6;
  1461.     }
  1462. //** PATCH_END - pipebombs ******
  1463.     else if (self.weapon == IT_ROCKET_LAUNCHER)
  1464.     {
  1465.         player_rocket1();
  1466.         W_FireRocket();
  1467.         self.attack_finished = time + 0.8;
  1468.     }
  1469. //** PATCH_BEGIN - flame thrower - Turrican ****
  1470.     else if (self.weapon == IT_FLAMETHROWER)
  1471.     {
  1472.         player_shot1();
  1473.         W_FireFlame();
  1474.         self.attack_finished = time + 0.03;
  1475.     }
  1476. //** PATCH_END - flame thrower - Turrican ******
  1477.     else if (self.weapon == IT_LIGHTNING)
  1478.     {
  1479.         player_light1();
  1480.         self.attack_finished = time + 0.1;
  1481.         sound (self, CHAN_AUTO, "weapons/lstart.wav", 1, ATTN_NORM);
  1482.     }
  1483. //** PATCH_BEGIN - tracbeam - Turrican ****
  1484.     else if (self.weapon == IT_TRACTOR_BEAM)
  1485.     {
  1486.         player_light1();
  1487.         self.attack_finished = time + 0.1;
  1488.         sound (self, CHAN_AUTO, "weapons/lstart.wav", 1, ATTN_NORM);
  1489.     }
  1490. //** PATCH_END - tracbeam - Turrican ******
  1491. };
  1492.  
  1493. //** PATCH_BEGIN - general change - Turrican ****
  1494. /*
  1495. ============
  1496. W_NotifyOfChange
  1497.  
  1498. ============
  1499. */
  1500. void() W_NotifyOfChange =
  1501. {
  1502.     if (self.weapon == IT_AXE)
  1503.         sprint(self,"Normal Axe\n");
  1504.     else if (self.weapon == IT_THROWING_AXE)
  1505.         sprint(self,"Throwing Axe\n");
  1506.     else if (self.weapon == IT_MORNINGSTAR)
  1507.         sprint(self,"Morning Star\n");
  1508.     else if (self.weapon == IT_SHOTGUN)
  1509.         sprint(self,"Shotgun\n");
  1510.     else if (self.weapon == IT_SUPER_SHOTGUN)
  1511.         sprint(self,"Super Shotgun\n");
  1512.     else if (self.weapon == IT_LASER)
  1513.         sprint(self,"Laser\n");
  1514.     else if (self.weapon == IT_SUPER_LASER)
  1515.         sprint(self,"Super Laser\n");
  1516.     else if (self.weapon == IT_NAILGUN)
  1517.         sprint(self,"Nailgun\n");
  1518.     else if (self.weapon == IT_SUPER_NAILGUN)
  1519.         sprint(self,"Super Nailgun\n");
  1520.     else if (self.weapon == IT_GRENADE_LAUNCHER)
  1521.         sprint(self,"Grenade Launcher\n");
  1522.     else if (self.weapon == IT_PIPE_BOMBS)
  1523.         sprint(self,"Pipe Bombs\n");
  1524.     else if (self.weapon == IT_FLAMETHROWER)
  1525.         sprint(self,"Flamethrower\n");
  1526.     else if (self.weapon == IT_ROCKET_LAUNCHER)
  1527.         sprint(self,"Rocket Launcher\n");
  1528.     else if (self.weapon == IT_LIGHTNING)
  1529.         sprint(self,"Lightning Gun\n");
  1530.     else if (self.weapon == IT_TRACTOR_BEAM)
  1531.         sprint(self,"Tractor Beam\n");
  1532. };
  1533. //** PATCH_END - general change - Turrican ******
  1534.  
  1535. /*
  1536. ============
  1537. W_ChangeWeapon
  1538.  
  1539. ============
  1540. */
  1541. void() W_ChangeWeapon =
  1542. {
  1543. //** PATCH_BEGIN - extra weapons - Turrican ****
  1544.     local    float    am, fl;
  1545.     local    float    extra_weapon;
  1546. //** PATCH_END - extra weapons - Turrican ******
  1547.  
  1548.     am = 0;
  1549.  
  1550.     if (self.impulse == 1)
  1551.     {
  1552. //** PATCH_BEGIN - throwaxe - Turrican ****
  1553. //** PATCH_BEGIN - grap109b - Turrican ****
  1554. // Cycle the axes.
  1555.         if (self.weapon == IT_AXE && self.num_axes >= 1)
  1556.         {
  1557.             fl = IT_THROWING_AXE;
  1558.         }
  1559.         else if ((self.weapon == IT_AXE) || (self.weapon == IT_THROWING_AXE))
  1560.         {
  1561.             fl = IT_MORNINGSTAR;
  1562.         }
  1563.         else
  1564.         {
  1565.             fl = IT_AXE;
  1566.         }
  1567. //** PATCH_END - grap109b - Turrican ******
  1568. //** PATCH_END - throwaxe - Turrican ******
  1569.     }
  1570.     else if (self.impulse == 2)
  1571.     {
  1572.         fl = IT_SHOTGUN;
  1573.         if (self.ammo_shells < 1)
  1574.             am = 1;
  1575.     }
  1576.     else if (self.impulse == 3)
  1577.     {
  1578. //** PATCH_BEGIN - extra weapons - Turrican ****
  1579. // Swap between the two shottys, with the super shotty coming up first.
  1580.         if(self.weapon == IT_SUPER_SHOTGUN)
  1581.         {
  1582.             fl = IT_SHOTGUN;
  1583.             if (self.ammo_shells < 1)
  1584.                 am = 1;
  1585.         }
  1586.         else
  1587.         {
  1588.             fl = IT_SUPER_SHOTGUN;
  1589.             if (self.ammo_shells < 2)
  1590.                 am = 1;
  1591.         }
  1592. //** PATCH_END - extra weapons - Turrican ******
  1593.     }
  1594.     else if (self.impulse == 4)
  1595.     {
  1596. //** PATCH_BEGIN - tchwpn10 - Turrican ****
  1597. // Swap between the two lasers, with the super laser coming up first.
  1598.         if(self.weapon == IT_SUPER_LASER)
  1599.         {
  1600.             fl = IT_LASER;
  1601.             if (self.ammo_cells < 1)
  1602.                 am = 1;
  1603.         }
  1604.         else if(self.items & IT_SUPER_SHOTGUN)
  1605.         {
  1606.             fl = IT_SUPER_LASER;
  1607.             if (self.ammo_cells < 2)
  1608.                 am = 1;
  1609.         }
  1610.         else
  1611.         {
  1612.             fl = IT_LASER;
  1613.             if (self.ammo_cells < 1)
  1614.                 am = 1;
  1615.         }
  1616.  
  1617. //** PATCH_END - tchwpn10 - Turrican ******
  1618.     }
  1619.     else if (self.impulse == 5)
  1620.     {
  1621. //** PATCH_BEGIN - extra weapons - Turrican ****
  1622. // Swap between the two nailguns, with the super nailgun coming up first.
  1623.         if(self.weapon == IT_SUPER_NAILGUN)
  1624.         {
  1625.             fl = IT_NAILGUN;
  1626.             if (self.ammo_nails < 1)
  1627.                 am = 1;
  1628.         }
  1629.         else if(self.items & IT_SUPER_NAILGUN)
  1630.         {
  1631.             fl = IT_SUPER_NAILGUN;
  1632.             if (self.ammo_nails < 2)
  1633.                 am = 1;
  1634.         }
  1635.         else
  1636.         {
  1637.             fl = IT_NAILGUN;
  1638.             if (self.ammo_nails < 1)
  1639.                 am = 1;
  1640.         }
  1641.  
  1642. //** PATCH_END - extra weapons - Turrican ******
  1643.     }
  1644.     else if (self.impulse == 6)
  1645.     {
  1646. //** PATCH_BEGIN - pipebombs ****
  1647. // Swap between grenades and pipe bombs.
  1648.         if (self.weapon == IT_GRENADE_LAUNCHER)
  1649.         {
  1650.             fl = IT_PIPE_BOMBS;
  1651.         }
  1652.         else
  1653.         {
  1654.             fl = IT_GRENADE_LAUNCHER;
  1655.         }
  1656. //** PATCH_END - pipebombs ******
  1657.         if (self.ammo_rockets < 1)
  1658.             am = 1;
  1659.     }
  1660.     else if (self.impulse == 7)
  1661.     {
  1662. //** PATCH_BEGIN - flame thrower - Turrican ****
  1663. // Swap between rocket launcher and flamethrower.
  1664.         if (self.weapon == IT_ROCKET_LAUNCHER)
  1665.         {
  1666.             fl = IT_FLAMETHROWER;
  1667.         }
  1668.         else
  1669.         {
  1670.             fl = IT_ROCKET_LAUNCHER;
  1671.         }
  1672. //** PATCH_END - flame thrower - Turrican ******
  1673.         if (self.ammo_rockets < 1)
  1674.             am = 1;
  1675.     }
  1676.     else if (self.impulse == 8)
  1677.     {
  1678. //** PATCH_BEGIN - flame thrower - Turrican ****
  1679. // Swap between lightning gun and tractor beam.
  1680.         if (self.weapon == IT_LIGHTNING)
  1681.         {
  1682.             fl = IT_TRACTOR_BEAM;
  1683.         }
  1684.         else
  1685.         {
  1686.             fl = IT_LIGHTNING;
  1687.         }
  1688. //** PATCH_END - flame thrower - Turrican ******
  1689.         if (self.ammo_cells < 1)
  1690.             am = 1;
  1691.     }
  1692.  
  1693. //** PATCH_BEGIN - grap109b - Turrican ****
  1694.     else if (self.impulse == 100)
  1695.     {
  1696. // Toggle morningstar.
  1697.         if (self.weapon == IT_MORNINGSTAR)
  1698.         {
  1699.             fl = self.prev_weapon;
  1700.             self.prev_weapon = IT_MORNINGSTAR;
  1701.         }
  1702.         else
  1703.         {
  1704.             self.prev_weapon = self.weapon;
  1705.             fl = IT_MORNINGSTAR;
  1706.         }
  1707.     }
  1708. //** PATCH_END - grap109b - Turrican ******
  1709.  
  1710.     self.impulse = 0;
  1711.  
  1712. //** PATCH_BEGIN - extra weapons - Turrican ****
  1713.     if (fl == IT_MORNINGSTAR ||
  1714.         fl == IT_THROWING_AXE ||
  1715.         fl == IT_LASER ||
  1716.         fl == IT_SUPER_LASER ||
  1717.         fl == IT_PIPE_BOMBS ||
  1718.         fl == IT_FLAMETHROWER ||
  1719.         fl == IT_TRACTOR_BEAM)
  1720.     {
  1721.         // Get EXTRA weapon number from weapon IT number.
  1722.         if (fl == IT_MORNINGSTAR)
  1723.             extra_weapon = EXTRA_MORNINGSTAR;
  1724.         else if (fl == IT_THROWING_AXE)
  1725.             extra_weapon = EXTRA_THROWING_AXE;
  1726.         else if (fl == IT_LASER)
  1727.             extra_weapon = EXTRA_LASER;
  1728.         else if (fl == IT_SUPER_LASER && (self.items & IT_SUPER_SHOTGUN))
  1729.             extra_weapon = EXTRA_SUPER_LASER;
  1730.         else if (fl == IT_PIPE_BOMBS && (self.items & IT_GRENADE_LAUNCHER))
  1731.             extra_weapon = EXTRA_PIPE_BOMBS;
  1732.         else if (fl == IT_FLAMETHROWER && (self.items & IT_ROCKET_LAUNCHER))
  1733.             extra_weapon = EXTRA_FLAMETHROWER;
  1734.         else if (fl == IT_TRACTOR_BEAM && (self.items & IT_LIGHTNING))
  1735.             extra_weapon = EXTRA_TRACTOR_BEAM;
  1736.         else
  1737.             extra_weapon = EXTRA_NO_WEAPON;
  1738.  
  1739.         if (!(self.extra_items & extra_weapon))
  1740.         {    // don't have the weapon or the ammo
  1741.             sprint (self, "no weapon\n");
  1742.             return;
  1743.         }
  1744.     }
  1745.     else
  1746.     {
  1747.         if (!(self.items & fl))
  1748.         {    // don't have the weapon or the ammo
  1749.             sprint (self, "no weapon\n");
  1750.             return;
  1751.         }
  1752.     }
  1753. //** PATCH_END - extra weapons - Turrican ******
  1754.  
  1755.     if (am)
  1756.     {    // don't have the ammo
  1757.         sprint (self, "not enough ammo\n");
  1758.         return;
  1759.     }
  1760.  
  1761. //
  1762. // set weapon, set ammo
  1763. //
  1764.     self.weapon = fl;
  1765.     W_NotifyOfChange ();
  1766.     W_SetCurrentAmmo ();
  1767. };
  1768.  
  1769. /*
  1770. ============
  1771. CheatCommand
  1772. ============
  1773. */
  1774. void() CheatCommand =
  1775. {
  1776.     if (deathmatch || coop)
  1777.         return;
  1778.  
  1779. //** PATCH_BEGIN - morph2 - Turrican ****
  1780.     if(self.morphnum != M_HUMAN)
  1781.     {
  1782.         if(self.morphnum == M_OGRE)
  1783.         {
  1784.             self.ammo_rockets = 100;
  1785.             self.currentammo = self.ammo_rockets;
  1786.             self.weapon = IT_GRENADE_LAUNCHER;
  1787.             self.items = self.items | IT_ROCKETS;
  1788.         }
  1789.         self.health = 100 * self.health_modifier;
  1790.         return;
  1791.     }
  1792. //** PATCH_END - morph2 - Turrican ******
  1793.  
  1794.     self.ammo_rockets = 100;
  1795.     self.ammo_nails = 200;
  1796.     self.ammo_shells = 100;
  1797. //** PATCH_BEGIN - throwaxe ****
  1798.     self.num_axes = 100;
  1799. //** PATCH_END - throwaxe ******
  1800.     self.items = self.items |
  1801.         IT_AXE |
  1802.         IT_SHOTGUN |
  1803.         IT_SUPER_SHOTGUN |
  1804.         IT_NAILGUN |
  1805.         IT_SUPER_NAILGUN |
  1806.         IT_GRENADE_LAUNCHER |
  1807.         IT_ROCKET_LAUNCHER |
  1808.         IT_KEY1 | IT_KEY2;
  1809.  
  1810. //** PATCH_BEGIN - extra weapons - Turrican ****
  1811.     self.extra_items = self.extra_items |
  1812.         EXTRA_MORNINGSTAR |
  1813.         EXTRA_THROWING_AXE |
  1814.         EXTRA_LASER |
  1815.         EXTRA_SUPER_LASER |
  1816.         EXTRA_PIPE_BOMBS |
  1817.         EXTRA_FLAMETHROWER |
  1818.         EXTRA_TRACTOR_BEAM;
  1819. //** PATCH_END - extra weapons - Turrican ******
  1820.  
  1821.     self.ammo_cells = 200;
  1822.     self.items = self.items | IT_LIGHTNING;
  1823.  
  1824.     self.weapon = IT_ROCKET_LAUNCHER;
  1825.     self.impulse = 0;
  1826.     W_SetCurrentAmmo ();
  1827.  
  1828. //** PATCH_BEGIN - general change - Turrican ****
  1829. // Added health and armor to the general weapon cheat.
  1830.     self.armortype = 0.8;
  1831.     self.armorvalue = 200;
  1832.     self.items = self.items - (self.items & (IT_ARMOR1 | IT_ARMOR2 | IT_ARMOR3)) + IT_ARMOR3;
  1833.  
  1834.     self.health = 100;
  1835. //** PATCH_END - general change - Turrican ******
  1836. };
  1837.  
  1838. /*
  1839. ============
  1840. CycleWeaponCommand
  1841.  
  1842. Go to the next weapon with ammo
  1843. ============
  1844. */
  1845. void() CycleWeaponCommand =
  1846. {
  1847. //** PATCH_BEGIN - extra weapons - Turrican ****
  1848.     local    float    am;
  1849.     local    float    extra_weapon;
  1850. //** PATCH_END - extra weapons - Turrican ******
  1851.     self.impulse = 0;
  1852.  
  1853.     while (1)
  1854.     {
  1855.         am = 0;
  1856.  
  1857.         if (self.weapon == IT_LIGHTNING)
  1858.         {
  1859. //** PATCH_BEGIN - tracbeam - Turrican ****
  1860.             self.weapon = IT_TRACTOR_BEAM;
  1861.             if (self.ammo_cells < 1)
  1862.                 am = 1;
  1863.         }
  1864.         else if (self.weapon == IT_TRACTOR_BEAM)
  1865.         {
  1866. //** PATCH_END - tracbeam - Turrican ******
  1867. //** PATCH_BEGIN - throwaxe - Turrican ****
  1868. //** PATCH_BEGIN - grap109b - Turrican ****
  1869. // Cycle the axes.
  1870.             self.weapon = IT_AXE;
  1871.         }
  1872.         else if (self.weapon == IT_AXE && self.num_axes >= 1)
  1873.         {
  1874.             self.weapon = IT_THROWING_AXE;
  1875.         }
  1876.         else if ((self.weapon == IT_AXE) || (self.weapon == IT_THROWING_AXE))
  1877.         {
  1878.             self.weapon = IT_MORNINGSTAR;
  1879.         }
  1880.         else if (self.weapon == IT_MORNINGSTAR)
  1881. //** PATCH_END - grap109b - Turrican ******
  1882. //** PATCH_END - throwaxe - Turrican ******
  1883.         {
  1884.             self.weapon = IT_SHOTGUN;
  1885.             if (self.ammo_shells < 1)
  1886.                 am = 1;
  1887.         }
  1888.         else if (self.weapon == IT_SHOTGUN)
  1889.         {
  1890.             self.weapon = IT_SUPER_SHOTGUN;
  1891.             if (self.ammo_shells < 2)
  1892.                 am = 1;
  1893.         }
  1894.         else if (self.weapon == IT_SUPER_SHOTGUN)
  1895.         {
  1896. //** PATCH_BEGIN - tchwpn10 - Turrican ****
  1897.             self.weapon = IT_LASER;
  1898.             if (self.ammo_cells < 1)
  1899.                 am = 1;
  1900.         }
  1901.         else if (self.weapon == IT_LASER)
  1902.         {
  1903.             self.weapon = IT_SUPER_LASER;
  1904.             if (self.ammo_cells < 2)
  1905.                 am = 1;
  1906.         }
  1907.         else if (self.weapon == IT_SUPER_LASER)
  1908.         {
  1909. //** PATCH_END - tchwpn10 - Turrican ******
  1910.             self.weapon = IT_NAILGUN;
  1911.             if (self.ammo_nails < 1)
  1912.                 am = 1;
  1913.         }
  1914.         else if (self.weapon == IT_NAILGUN)
  1915.         {
  1916.             self.weapon = IT_SUPER_NAILGUN;
  1917.             if (self.ammo_nails < 2)
  1918.                 am = 1;
  1919.         }
  1920.         else if (self.weapon == IT_SUPER_NAILGUN)
  1921.         {
  1922. //** PATCH_BEGIN - pipebombs ****
  1923.             self.weapon = IT_GRENADE_LAUNCHER;
  1924.             if (self.ammo_rockets < 1)
  1925.                 am = 1;
  1926.         }
  1927.         else if (self.weapon == IT_GRENADE_LAUNCHER)
  1928.         {
  1929.             self.weapon = IT_PIPE_BOMBS;
  1930.             if (self.ammo_rockets < 1)
  1931.                 am = 1;
  1932.         }
  1933.         else if (self.weapon == IT_PIPE_BOMBS)
  1934. //** PATCH_END - pipebombs ******
  1935.         {
  1936.             self.weapon = IT_ROCKET_LAUNCHER;
  1937.             if (self.ammo_rockets < 1)
  1938.                 am = 1;
  1939.         }
  1940.         else if (self.weapon == IT_ROCKET_LAUNCHER)
  1941. //** PATCH_BEGIN - flame thrower - Turrican ****
  1942.         {
  1943.             self.weapon = IT_FLAMETHROWER;
  1944.             if (self.ammo_rockets < 1)
  1945.                 am = 1;
  1946.         }
  1947.         else if (self.weapon == IT_FLAMETHROWER)
  1948. //** PATCH_BEGIN - flame thrower - Turrican ****
  1949.         {
  1950.             self.weapon = IT_LIGHTNING;
  1951.             if (self.ammo_cells < 1)
  1952.                 am = 1;
  1953.         }
  1954.  
  1955. //** PATCH_BEGIN - extra weapons - Turrican ****
  1956.     if (self.weapon == IT_MORNINGSTAR ||
  1957.         self.weapon == IT_THROWING_AXE ||
  1958.         self.weapon == IT_LASER ||
  1959.         self.weapon == IT_SUPER_LASER ||
  1960.         self.weapon == IT_PIPE_BOMBS ||
  1961.         self.weapon == IT_FLAMETHROWER ||
  1962.         self.weapon == IT_TRACTOR_BEAM)
  1963.     {
  1964.         // Get EXTRA weapon number from weapon IT number.
  1965.         if (self.weapon == IT_MORNINGSTAR)
  1966.             extra_weapon = EXTRA_MORNINGSTAR;
  1967.         else if (self.weapon == IT_THROWING_AXE)
  1968.             extra_weapon = EXTRA_THROWING_AXE;
  1969.         else if (self.weapon == IT_LASER)
  1970.             extra_weapon = EXTRA_LASER;
  1971.         else if (self.weapon == IT_SUPER_LASER && (self.items & IT_SUPER_SHOTGUN))
  1972.             extra_weapon = EXTRA_SUPER_LASER;
  1973.         else if (self.weapon == IT_PIPE_BOMBS && (self.items & IT_GRENADE_LAUNCHER))
  1974.             extra_weapon = EXTRA_PIPE_BOMBS;
  1975.         else if (self.weapon == IT_FLAMETHROWER && (self.items & IT_ROCKET_LAUNCHER))
  1976.             extra_weapon = EXTRA_FLAMETHROWER;
  1977.         else if (self.weapon == IT_TRACTOR_BEAM && (self.items & IT_LIGHTNING))
  1978.             extra_weapon = EXTRA_TRACTOR_BEAM;
  1979.         else
  1980.             extra_weapon = EXTRA_NO_WEAPON;
  1981.  
  1982.             if ( (self.extra_items & extra_weapon) && am == 0)
  1983.             {
  1984.                 W_NotifyOfChange ();
  1985.                 W_SetCurrentAmmo ();
  1986.                 return;
  1987.             }
  1988.         }
  1989.         else
  1990.         {
  1991.             if ( (self.items & self.weapon) && am == 0)
  1992.             {
  1993.                 W_NotifyOfChange ();
  1994.                 W_SetCurrentAmmo ();
  1995.                 return;
  1996.             }
  1997.         }
  1998. //** PATCH_END - extra weapons - Turrican ******
  1999.     }
  2000.  
  2001. };
  2002.  
  2003. /*
  2004. ============
  2005. CycleWeaponReverseCommand
  2006.  
  2007. Go to the prev weapon with ammo
  2008. ============
  2009. */
  2010. void() CycleWeaponReverseCommand =
  2011. {
  2012. //** PATCH_BEGIN - extra weapons - Turrican ****
  2013.     local   float   am;
  2014.     local    float    extra_weapon;
  2015. //** PATCH_END - extra weapons - Turrican ******
  2016.     self.impulse = 0;
  2017.  
  2018.     while (1)
  2019.     {
  2020.         am = 0;
  2021.  
  2022.         if (self.weapon == IT_LIGHTNING)
  2023. //** PATCH_BEGIN - flame thrower - Turrican ****
  2024.         {
  2025.             self.weapon = IT_FLAMETHROWER;
  2026.             if (self.ammo_rockets < 1)
  2027.                 am = 1;
  2028.         }
  2029.         else if (self.weapon == IT_FLAMETHROWER)
  2030. //** PATCH_END - flame thrower - Turrican ******
  2031.         {
  2032.             self.weapon = IT_ROCKET_LAUNCHER;
  2033.             if (self.ammo_rockets < 1)
  2034.                 am = 1;
  2035.         }
  2036.         else if (self.weapon == IT_ROCKET_LAUNCHER)
  2037. //** PATCH_BEGIN - pipebombs ****
  2038.         {
  2039.             self.weapon = IT_PIPE_BOMBS;
  2040.             if (self.ammo_rockets < 1)
  2041.                 am = 1;
  2042.         }
  2043.         else if (self.weapon == IT_PIPE_BOMBS)
  2044. //** PATCH_END - pipebombs ******
  2045.         {
  2046.             self.weapon = IT_GRENADE_LAUNCHER;
  2047.             if (self.ammo_rockets < 1)
  2048.                 am = 1;
  2049.         }
  2050.         else if (self.weapon == IT_GRENADE_LAUNCHER)
  2051.         {
  2052.             self.weapon = IT_SUPER_NAILGUN;
  2053.             if (self.ammo_nails < 2)
  2054.                 am = 1;
  2055.         }
  2056.         else if (self.weapon == IT_SUPER_NAILGUN)
  2057.         {
  2058.             self.weapon = IT_NAILGUN;
  2059.             if (self.ammo_nails < 1)
  2060.                 am = 1;
  2061.         }
  2062.         else if (self.weapon == IT_NAILGUN)
  2063.         {
  2064. //** PATCH_BEGIN - tchwpn10 - Turrican ****
  2065.             self.weapon = IT_SUPER_LASER;
  2066.             if (self.ammo_cells < 2)
  2067.                 am = 1;
  2068.         }
  2069.         else if (self.weapon == IT_SUPER_LASER)
  2070.         {
  2071.             self.weapon = IT_LASER;
  2072.             if (self.ammo_cells < 1)
  2073.                 am = 1;
  2074.         }
  2075.         else if (self.weapon == IT_LASER)
  2076.         {
  2077. //** PATCH_END - tchwpn10 - Turrican ******
  2078.             self.weapon = IT_SUPER_SHOTGUN;
  2079.             if (self.ammo_shells < 2)
  2080.                 am = 1;
  2081.         }
  2082.         else if (self.weapon == IT_SUPER_SHOTGUN)
  2083.         {
  2084.             self.weapon = IT_SHOTGUN;
  2085.             if (self.ammo_shells < 1)
  2086.                 am = 1;
  2087.         }
  2088.         else if (self.weapon == IT_SHOTGUN)
  2089.         {
  2090. //** PATCH_BEGIN - throwaxe - Turrican ****
  2091. //** PATCH_BEGIN - grap109b - Turrican ****
  2092. // Cycle the axes.
  2093.             self.weapon = IT_MORNINGSTAR;
  2094.         }
  2095.         else if (self.weapon == IT_MORNINGSTAR && self.num_axes >= 1)
  2096.         {
  2097.             self.weapon = IT_THROWING_AXE;
  2098.         }
  2099.         else if ((self.weapon == IT_MORNINGSTAR) || (self.weapon == IT_THROWING_AXE))
  2100.         {
  2101. //** PATCH_END - grap109b - Turrican ******
  2102. //** PATCH_END - throwaxe - Turrican ******
  2103.             self.weapon = IT_AXE;
  2104.         }
  2105.         else if (self.weapon == IT_AXE)
  2106.         {
  2107. //** PATCH_BEGIN - tracbeam - Turrican ****
  2108.             self.weapon = IT_TRACTOR_BEAM;
  2109.             if (self.ammo_cells < 1)
  2110.                 am = 1;
  2111.         }
  2112.         else if (self.weapon == IT_TRACTOR_BEAM)
  2113.         {
  2114. //** PATCH_END - tracbeam - Turrican ******
  2115.             self.weapon = IT_LIGHTNING;
  2116.             if (self.ammo_cells < 1)
  2117.                 am = 1;
  2118.         }
  2119.  
  2120. //** PATCH_BEGIN - extra weapons - Turrican ****
  2121.         if (self.weapon == IT_MORNINGSTAR ||
  2122.             self.weapon == IT_THROWING_AXE ||
  2123.             self.weapon == IT_LASER ||
  2124.             self.weapon == IT_SUPER_LASER ||
  2125.             self.weapon == IT_PIPE_BOMBS ||
  2126.             self.weapon == IT_FLAMETHROWER ||
  2127.             self.weapon == IT_TRACTOR_BEAM)
  2128.         {
  2129.             // Get EXTRA weapon number from weapon IT number.
  2130.             if (self.weapon == IT_MORNINGSTAR)
  2131.                 extra_weapon = EXTRA_MORNINGSTAR;
  2132.             else if (self.weapon == IT_THROWING_AXE)
  2133.                 extra_weapon = EXTRA_THROWING_AXE;
  2134.             else if (self.weapon == IT_LASER)
  2135.                 extra_weapon = EXTRA_LASER;
  2136.             else if (self.weapon == IT_SUPER_LASER && (self.items & IT_SUPER_SHOTGUN))
  2137.                 extra_weapon = EXTRA_SUPER_LASER;
  2138.             else if (self.weapon == IT_PIPE_BOMBS && (self.items & IT_GRENADE_LAUNCHER))
  2139.                 extra_weapon = EXTRA_PIPE_BOMBS;
  2140.             else if (self.weapon == IT_FLAMETHROWER && (self.items & IT_ROCKET_LAUNCHER))
  2141.                 extra_weapon = EXTRA_FLAMETHROWER;
  2142.             else if (self.weapon == IT_TRACTOR_BEAM && (self.items & IT_LIGHTNING))
  2143.                 extra_weapon = EXTRA_TRACTOR_BEAM;
  2144.             else
  2145.                 extra_weapon = EXTRA_NO_WEAPON;
  2146.  
  2147.             if ( (self.extra_items & extra_weapon) && am == 0)
  2148.             {
  2149.                 W_NotifyOfChange ();
  2150.                 W_SetCurrentAmmo ();
  2151.                 return;
  2152.             }
  2153.         }
  2154.         else
  2155.         {
  2156.             if ( (self.items & self.weapon) && am == 0)
  2157.             {
  2158.                 W_NotifyOfChange ();
  2159.                 W_SetCurrentAmmo ();
  2160.                 return;
  2161.             }
  2162.         }
  2163. //** PATCH_END - extra weapons - Turrican ******
  2164.     }
  2165. };
  2166.  
  2167. /*
  2168. ============
  2169. ServerflagsCommand
  2170.  
  2171. Just for development
  2172. ============
  2173. */
  2174. void() ServerflagsCommand =
  2175. {
  2176.     serverflags = serverflags * 2 + 1;
  2177. };
  2178.  
  2179. void() QuadCheat =
  2180. {
  2181.     if (deathmatch || coop)
  2182.         return;
  2183.     self.super_time = 1;
  2184.     self.super_damage_finished = time + 30;
  2185.     self.items = self.items | IT_QUAD;
  2186.     dprint ("quad cheat\n");
  2187. };
  2188.  
  2189. //** PATCH_BEGIN - extra cheats - Turrican ****
  2190. void() InvulnerabilityCheat =
  2191. {
  2192.     if (deathmatch || coop)
  2193.         return;
  2194.     self.invincible_time = 1;
  2195.     self.invincible_finished = time + 30;
  2196.     self.items = self.items | IT_INVULNERABILITY;
  2197.     dprint ("invulnerability cheat\n");
  2198. };
  2199.  
  2200. void() InvisibilityCheat =
  2201. {
  2202.     if (deathmatch || coop)
  2203.         return;
  2204.     self.invisible_time = 1;
  2205.     self.invisible_finished = time + 30;
  2206.     self.items = self.items | IT_INVISIBILITY;
  2207.     dprint ("invisibility cheat\n");
  2208. };
  2209.  
  2210. void() BiosuitCheat =
  2211. {
  2212.     if (deathmatch || coop)
  2213.         return;
  2214.     self.rad_time = 1;
  2215.     self.radsuit_finished = time + 30;
  2216.     self.items = self.items | IT_SUIT;
  2217.     dprint ("biosuit cheat\n");
  2218. };
  2219. //** PATCH_END - extra cheats - Turrican ******
  2220.  
  2221. //** PATCH_BEGIN - quickfire - Turrican ****
  2222. // Functions to change to a weapon, fire it once and return to the previous
  2223. // weapon.
  2224. void() FireOneRocket =
  2225. {
  2226.     if (!(self.items & IT_ROCKET_LAUNCHER))
  2227.     {    // don't have the weapon
  2228.         sprint (self, "no weapon\n");
  2229.         return;
  2230.     }
  2231.  
  2232.     if (self.ammo_rockets < 1)
  2233.     {    // don't have the ammo
  2234.         sprint (self, "not enough ammo\n");
  2235.         return;
  2236.     }
  2237.  
  2238.     self.quickfire = 1;
  2239.  
  2240.     self.prev_weapon = self.weapon;
  2241.     self.weapon = IT_ROCKET_LAUNCHER;
  2242.     W_NotifyOfChange ();
  2243.  
  2244.     self.currentammo = self.ammo_rockets;
  2245.     self.weaponmodel = "progs/v_rock2.mdl";
  2246.     self.weaponframe = 0;
  2247.     self.items = self.items | IT_ROCKETS;
  2248.  
  2249.     W_Attack ();
  2250.  
  2251. };
  2252.  
  2253. void() FireOneGrenade =
  2254. {
  2255.     if (!(self.items & IT_GRENADE_LAUNCHER))
  2256.     {    // don't have the weapon
  2257.         sprint (self, "no weapon\n");
  2258.         return;
  2259.     }
  2260.  
  2261.     if (self.ammo_rockets < 1)
  2262.     {    // don't have the ammo
  2263.         sprint (self, "not enough ammo\n");
  2264.         return;
  2265.     }
  2266.  
  2267.     self.quickfire = 1;
  2268.  
  2269.     self.prev_weapon = self.weapon;
  2270.     self.weapon = IT_GRENADE_LAUNCHER;
  2271.     W_NotifyOfChange ();
  2272.  
  2273.     self.currentammo = self.ammo_rockets;
  2274.     self.weaponmodel = "progs/v_rock.mdl";
  2275.     self.weaponframe = 0;
  2276.     self.items = self.items | IT_ROCKETS;
  2277.  
  2278.     W_Attack ();
  2279. };
  2280.  
  2281. void() FireOneAxe =
  2282. {
  2283.     self.quickfire = 1;
  2284.  
  2285.     self.prev_weapon = self.weapon;
  2286.     self.weapon = IT_AXE;
  2287.     W_NotifyOfChange ();
  2288.  
  2289.     self.currentammo = 0;
  2290.     self.weaponmodel = "progs/v_axe.mdl";
  2291.     self.weaponframe = 0;
  2292.  
  2293.     W_Attack ();
  2294. };
  2295.  
  2296. void() FireOneThrowAxe =
  2297. {
  2298.     if (self.num_axes < 1)
  2299.     {    // don't have the ammo
  2300.         sprint (self, "not enough ammo\n");
  2301.         return;
  2302.     }
  2303.  
  2304.     self.quickfire = 1;
  2305.  
  2306.     self.prev_weapon = self.weapon;
  2307.     self.weapon = IT_THROWING_AXE;
  2308.     W_NotifyOfChange ();
  2309.  
  2310.     self.currentammo = self.num_axes;
  2311.     self.weaponmodel = "progs/v_axe.mdl";
  2312.     self.weaponframe = 0;
  2313.  
  2314.     W_Attack ();
  2315. };
  2316. //** PATCH_END - quickfire - Turrican ******
  2317.  
  2318. /*
  2319. ============
  2320. ImpulseCommands
  2321.  
  2322. ============
  2323. */
  2324. //** PATCH_BEGIN - morph2 ****
  2325. void() player_zombie_become;
  2326. void() player_shalrath_become;
  2327. void() player_human_become;
  2328. void() player_wizard_become;
  2329. void() player_hknight_become;
  2330. void() player_shambler_become;
  2331. void() player_demon_become;
  2332. void() player_ogre_become;
  2333. //** PATCH_BEGIN - morph2 ****
  2334.  
  2335. void() ImpulseCommands =
  2336. {
  2337. //** PATCH_BEGIN - grenades - Turrican ****
  2338.     local     string    s;
  2339. //** PATCH_END - grenades - Turrican ******
  2340.  
  2341. //** PATCH_BEGIN - quickfire - Turrican ****
  2342.     if (self.quickfire)
  2343.     {
  2344.         if (self.attack_finished < time)
  2345.         {
  2346.             self.weapon = self.prev_weapon;
  2347.             W_NotifyOfChange ();
  2348.             W_SetCurrentAmmo ();
  2349.  
  2350.             self.quickfire = 0;
  2351.         }
  2352.         self.impulse = 0;
  2353.     }
  2354. //** PATCH_END - quickfire - Turrican ******
  2355.  
  2356. //** PATCH_BEGIN - morph2 ****
  2357. // Executes impulses 1 to 10 for non human morphed players.
  2358.     if (self.impulse >= 1 && self.impulse <= 12 && self._impulse != SUB_Null)
  2359.     {
  2360.         self._impulse();
  2361.         return;
  2362.     }
  2363. //** PATCH_END - morph2 ******
  2364. //** PATCH_BEGIN - general change - Turrican ****
  2365.     if (self.impulse >= 1 && self.impulse <= 10)
  2366.         W_ChangeWeapon ();
  2367.     else if (self.impulse == 11)
  2368.         CycleWeaponCommand ();
  2369.     else if (self.impulse == 12)
  2370.         CycleWeaponReverseCommand();
  2371.     else if (self.impulse == 13)
  2372.         CheatCommand ();
  2373.     else if (self.impulse == 14)
  2374.         ServerflagsCommand ();
  2375.  
  2376. //** PATCH_BEGIN - grap109b - morph2 - Turrican ****
  2377.     else if (self.impulse == 100 && self.morphnum == M_HUMAN)
  2378.         W_ChangeWeapon();
  2379. //** PATCH_END - grap109b - morph2 - Turrican ******
  2380.  
  2381. //** PATCH_BEGIN - morph2 - Turrican ****
  2382. // Cycle morph.
  2383.     else if (self.impulse == 101 || self.impulse == 102)
  2384.     {
  2385.         if (self.impulse == 101)
  2386.         {
  2387.             self.morphnum = self.morphnum + 1;
  2388.             if (self.morphnum >= 8)
  2389.             {
  2390.                 self.morphnum = 0;
  2391.             }
  2392.         }
  2393.         else
  2394.         {
  2395.             self.morphnum = self.morphnum - 1;
  2396.             if (self.morphnum <= -1)
  2397.             {
  2398.                 self.morphnum = 7;
  2399.             }
  2400.         }
  2401.  
  2402.         if (self.morphnum == M_HUMAN) player_human_become();
  2403.         else if (self.morphnum == M_ZOMBIE) player_zombie_become();
  2404.         else if (self.morphnum == M_SHALRATH) player_shalrath_become();
  2405.         else if (self.morphnum == M_WIZARD) player_wizard_become();
  2406.         else if (self.morphnum == M_HKNIGHT) player_hknight_become();
  2407.         else if (self.morphnum == M_SHAMBLER) player_shambler_become();
  2408.         else if (self.morphnum == M_DEMON) player_demon_become();
  2409.         else if (self.morphnum == M_OGRE) player_ogre_become();
  2410.     }
  2411.  
  2412. //** PATCH_END - morph2 - Turrican ******
  2413.  
  2414. //** PATCH_BEGIN - pipebombs ****
  2415.     else if(self.impulse == 103 && self.morphnum == M_HUMAN)
  2416.         DetPipeBombs();
  2417. //** PATCH_END - pipebombs ****
  2418.  
  2419. //** PATCH_BEGIN - grenades - Turrican ****
  2420.     else if((self.impulse == 104 || self.impulse == 105) &&
  2421.              self.morphnum == M_HUMAN)
  2422.     {
  2423.         if(self.impulse == 104)
  2424.             self.grenade_time = self.grenade_time + 0.5;
  2425.         else
  2426.             self.grenade_time = self.grenade_time - 0.5;
  2427.  
  2428.         if(self.grenade_time < 0.5)
  2429.             self.grenade_time = 0.5;
  2430.         else if(self.grenade_time > 10)
  2431.             self.grenade_time = 10;
  2432.  
  2433.         s = ftos(self.grenade_time);
  2434.         sprint(self, "Grenade fuse set to ");
  2435.         sprint(self, s);
  2436.         if(self.grenade_time == 1)
  2437.             sprint(self, " second\n");
  2438.         else
  2439.             sprint(self, " seconds\n");
  2440.     }
  2441. //** PATCH_END - grenades - Turrican ******
  2442.  
  2443. //** PATCH_BEGIN - lazsight - Turrican ****
  2444.     else if (self.impulse == 106 && self.morphnum == M_HUMAN)
  2445.     {
  2446.         LaserTargeterToggle(self);
  2447.     }
  2448. //** PATCH_END - lazsight - Turrican ******
  2449. //** PATCH_BEGIN - no suicides in deathmatch - Turrican ****
  2450.     else if (self.impulse == 107)
  2451.     {
  2452.         if (deathmatch)
  2453.             return;
  2454.         localcmd("kill");
  2455.     }
  2456. //** PATCH_END - no suicides in deathmatch - Turrican ******
  2457.  
  2458. //** PATCH_BEGIN - quickfire - Turrican ****
  2459. // Impulses to change to a weapon, fire it once, and return to your previous
  2460. // weapon.
  2461. // Rocket launcher
  2462.     else if (self.impulse == 108 && self.morphnum == M_HUMAN)
  2463.     {
  2464.         FireOneRocket();
  2465.     }
  2466. // Grenade launcher
  2467.     else if (self.impulse == 109 && self.morphnum == M_HUMAN)
  2468.     {
  2469.         FireOneGrenade();
  2470.     }
  2471. // Axe
  2472.     else if (self.impulse == 110 && self.morphnum == M_HUMAN)
  2473.     {
  2474.         FireOneAxe();
  2475.     }
  2476. // Trowing axe
  2477.     else if (self.impulse == 111 && self.morphnum == M_HUMAN)
  2478.     {
  2479.         FireOneThrowAxe();
  2480.     }
  2481. //** PATCH_END - quickfire - Turrican ******
  2482.  
  2483. //** PATCH_BEGIN - mskin12 - Turrican ****
  2484.     if ((self.impulse == 200) || (self.impulse == 201) &&
  2485.          self.morphnum == M_HUMAN)
  2486.     {
  2487.         // Cycle the player skin number.
  2488.         if (self.impulse == 200)
  2489.         {
  2490.             self.skin = self.skin + 1;
  2491.             if ((self.skin >= 25 && self.netname != "AeNiMa") || (self.skin >= 26))
  2492.             {
  2493.                 self.skin = 0;
  2494.             }
  2495.         }
  2496.         else
  2497.         {
  2498.             self.skin = self.skin - 1;
  2499.             if (self.skin <= -1 && self.netname == "AeNiMa")
  2500.             {
  2501.                 self.skin = 25;
  2502.             }
  2503.             else if (self.skin <= -1)
  2504.             {
  2505.                 self.skin = 24;
  2506.             }
  2507.         }
  2508.  
  2509.         // Change the player skin.
  2510.         if (self.skin == 0)
  2511.         {
  2512.             centerprint(self, "SKIN: Quake Player (1)");
  2513.  
  2514.             // Restore player colors.
  2515.             if (self.colormap == 0)
  2516.             {
  2517.                 self.colormap = self.temp_colormap;
  2518.             }
  2519.         }
  2520.         else if (self.skin == 1)
  2521.         {
  2522.             centerprint(self, "SKIN: Duke Nukem (2)");
  2523.  
  2524.             // Make the skins ignore player colors.
  2525.             // (Assuming that the cycling method here stays the same.)
  2526.             if (self.colormap != 0)
  2527.             {
  2528.                 self.temp_colormap = self.colormap;
  2529.                 self.colormap = 0;
  2530.             }
  2531.         }
  2532.         else if (self.skin == 2) centerprint(self, "SKIN: Dark Toad (3)"); else
  2533.         if (self.skin == 3) centerprint(self, "SKIN: Stormtrooper (4)"); else
  2534.         if (self.skin == 4) centerprint(self, "SKIN: Han Solo (5)"); else
  2535.         if (self.skin == 5) centerprint(self, "SKIN: Wizard (6)"); else
  2536.         if (self.skin == 6) centerprint(self, "SKIN: Judge Dredd (7)"); else
  2537.         if (self.skin == 7) centerprint(self, "SKIN: C3PO (8)"); else
  2538.         if (self.skin == 8) centerprint(self, "SKIN: Captain Picard (9)"); else
  2539.         if (self.skin == 9) centerprint(self, "SKIN: Bossk (10)"); else
  2540.         if (self.skin == 10) centerprint(self,"SKIN: the Predator (11)"); else
  2541.         if (self.skin == 11) centerprint(self,"SKIN: Skeleton (12)"); else
  2542.         if (self.skin == 12) centerprint(self,"SKIN: Wan-Fu (13)"); else
  2543.         if (self.skin == 13) centerprint(self,"SKIN: Valkyrie Warrior (14)"); else
  2544.         if (self.skin == 14) centerprint(self,"SKIN: the Avatar (15)"); else
  2545.         if (self.skin == 15) centerprint(self,"SKIN: Boba Fett (16)"); else
  2546.         if (self.skin == 16) centerprint(self,"SKIN: NYPD Cop (17)"); else
  2547.         if (self.skin == 17) centerprint(self,"SKIN: Quake Enforcer (18)"); else
  2548.         if (self.skin == 18) centerprint(self,"SKIN: Jason (19)"); else
  2549.         if (self.skin == 19) centerprint(self,"SKIN: Crusader - No Remorse (20)"); else
  2550.         if (self.skin == 20) centerprint(self,"SKIN: White Knight (21)"); else
  2551.         if (self.skin == 21) centerprint(self,"SKIN: Quake biosuit (22)"); else
  2552.         if (self.skin == 22) centerprint(self,"SKIN: the Punisher (23)"); else
  2553.         if (self.skin == 23) centerprint(self,"SKIN: Ninja (24)"); else
  2554.         if (self.skin == 24)
  2555.         {
  2556.             centerprint(self,"SKIN: the Spawn (25)");
  2557.  
  2558.             // Make the skins ignore player colors.
  2559.             // (Assuming that the cycling method here stays the same.)
  2560.             if (self.colormap != 0)
  2561.             {
  2562.                 self.temp_colormap = self.colormap;
  2563.                 self.colormap = 0;
  2564.             }
  2565.         }
  2566.         else if (self.skin == 25)
  2567.         {
  2568.             centerprint(self,"SKIN: AeNiMa (26)");
  2569.  
  2570.             // Make the skins ignore player colors.
  2571.             // (Assuming that the cycling method here stays the same.)
  2572.             if (self.colormap != 0)
  2573.             {
  2574.                 self.temp_colormap = self.colormap;
  2575.                 self.colormap = 0;
  2576.             }
  2577.         }
  2578.  
  2579.     }
  2580. //** PATCH_END - mskin12 - Turrican ******
  2581.  
  2582. //** PATCH_BEGIN - extra cheats - Turrican ****
  2583.     else if (self.impulse == 251)
  2584.     {
  2585.         BiosuitCheat();
  2586.         InvisibilityCheat();
  2587.         QuadCheat();
  2588.         InvulnerabilityCheat();
  2589.     }
  2590.     else if (self.impulse == 252)
  2591.         BiosuitCheat ();
  2592.     else if (self.impulse == 253)
  2593.         InvisibilityCheat ();
  2594.     else if (self.impulse == 254)
  2595.         InvulnerabilityCheat ();
  2596. //** PATCH_END - extra cheats - Turrucan ******
  2597.  
  2598.     else if (self.impulse == 255)
  2599.         QuadCheat ();
  2600.  
  2601. //** PATCH_END - general change - Turrican ******
  2602.  
  2603.     self.impulse = 0;
  2604. };
  2605.  
  2606. /*
  2607. ============
  2608. W_WeaponFrame
  2609.  
  2610. Called every frame so impulse events can be handled as well as possible
  2611. ============
  2612. */
  2613. void() W_WeaponFrame =
  2614. {
  2615. //** PATCH_BEGIN - grap109b ****
  2616. //        if ( (time < self.attack_finished) || (self.hook_out))
  2617. //** PATCH_END - grap109b ******
  2618.     if (time < self.attack_finished)
  2619.         return;
  2620.  
  2621.     ImpulseCommands ();
  2622.  
  2623. // check for attack
  2624.     if (self.button0)
  2625.     {
  2626.         SuperDamageSound ();
  2627.         W_Attack ();
  2628.     }
  2629. };
  2630.  
  2631. /*
  2632. ========
  2633. SuperDamageSound
  2634.  
  2635. Plays sound if needed
  2636. ========
  2637. */
  2638. void() SuperDamageSound =
  2639. {
  2640.     if (self.super_damage_finished > time)
  2641.     {
  2642.         if (self.super_sound < time)
  2643.         {
  2644.             self.super_sound = time + 1;
  2645.             sound (self, CHAN_BODY, "items/damage3.wav", 1, ATTN_NORM);
  2646.         }
  2647.     }
  2648.     return;
  2649. };
  2650.  
  2651.  
  2652.